国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ WeChat アプレット ミニプログラム開発 ミニプログラムでログイン機(jī)能を?qū)g裝する方法の簡単な分析

ミニプログラムでログイン機(jī)能を?qū)g裝する方法の簡単な分析

Dec 06, 2021 am 10:11 AM
アプレット ログイン

ミニプログラムにログイン機(jī)能を?qū)g裝するにはどうすればよいですか?この記事では、ミニプログラムのログインを開く正しい方法を紹介します。

ミニプログラムでログイン機(jī)能を?qū)g裝する方法の簡単な分析

ミニ プログラム ネットワーク コンポーネント

https://developers.weixin.qq.com/miniprogram /dev/api/network/request/wx.request.html

リクエストタスクの説明

#メソッド 説明リクエスト タスクを中止します。 HTTP 応答ヘッダー イベントをリッスンします。リクエスト完了イベントよりも早く発生します。 HTTP 応答ヘッダー イベントのリスニングをキャンセルします。 Transfer-Encoding Chunk Received イベントをリッスンします。新しいチャンクを受信したときに発生します。 Transfer-Encoding Chunk Received イベントのリスニングをキャンセルします。
RequestTask.abort()
RequestTask.onHeadersReceived(関數(shù)コールバック)
RequestTask.offHeadersReceived(関數(shù)コールバック)
RequestTask.onChunkReceived(関數(shù)コールバック)
RequestTask.offChunkReceived(関數(shù)コールバック)

wx.request(Object object) 屬性

ここでは、より一般的に使用される屬性のみをリストします。すべての屬性リンクを參照してください。

#屬性url 開発者サーバー インターフェイスのアドレスですstring/object/ArrayBufferNoObject デフォルトは numbermethodstringGETNoHTTP リクエスト メソッド成功関數(shù)failfunction#completefunction##NoInterface コールバック関數(shù)中止されたリクエストであっても、通話を終了します (通話が成功または失敗した場合に実行されます)。
タイプ デフォルト値 必須 説明
string ## は
#data

リクエストされたパラメータ
header
##No リクエストされたヘッダーを設(shè)定します。ヘッダーにはリファラーを含めることはできませんセット。
content-type
application/json timeout
##No ミリ秒?yún)g位のタイムアウト
No インターフェイス呼び出しが成功した場合のコールバック関數(shù)
No コールバック関數(shù)インターフェイス呼び出し失敗の場合

要約すると、すべてのミニ プログラム インターフェイスには基本的に次の 2 つの特性があります:

パラメータ すべてはオブジェクトです。覚えやすく、拡張も簡単です。

    はすべて同じ結(jié)果処理メソッドを持ち、すべてに 3 つのコールバック屬性 (success、fail、complete) があります。
  • インターフェイスが実行されるときのさまざまな狀況における errMsg オブジェクトの紹介。

#コールバック屬性errMsg オブジェクト

成功{errMsg:"request:ok"...}fail{errMsg:"request:fail "...} 一部のシステムではこれが発生します失敗の後にはスペースがあるため、この判斷を使用するには正規(guī)表現(xiàn)を使用するのが最適です。また、indexOf 関數(shù)を使用して、-1 より大きいかどうかを判斷することもできます。 abort{errMsg:"request:fail abort"...}

サンプル コード

  let reqTask = wx.request({
      url: getApp().globalData.api,
      success(res) {
        if (res.errMsg === "request:ok") console.log("res", res);
      },
      fail(err) {
        // if(err.errMsg.indexOf('request:fail')>-1) console.log('err', err);
        if (/^request:fail/i.test(err.errMsg)) console.log("err", err);
      },
      complete(res) {
        console.log("resOrErr", res);
      },
    });
   const reqTaskOnHeadersReceived = (headers) => {
      reqTask.offHeadersReceived(reqTaskOnHeadersReceived);
      console.log("headers", headers);
      // 由于請求還未完全結(jié)束,所以我們沒辦法獲得請求的狀態(tài)碼,但是我們可以通過返回的requestBody的長度來進(jìn)行判斷。
      // 兩點(diǎn)說明:1. 兩個~~可以把字符串?dāng)?shù)字快速轉(zhuǎn)化為數(shù)字。
      // 2. 為什么取小于19,是由于后臺返回沒有權(quán)限的requestBody的時候Content-length為“18”,正常情況下是大于19的。所以具體多少得看一下具體情況。
      if (~~headers.header["Content-length"] < 19) reqTask.abort();
    };
    reqTask.onHeadersReceived(reqTaskOnHeadersReceived);

ミニ プログラム ログイン インターフェイス

  • ##wx 。 getUserProfile(Object object)#ユーザー情報を取得します。これは、ページ上でクリック イベントが生成された後にのみ呼び出すことができます (たとえば、

    button

    bindtap のコールバック內(nèi))。リクエストごとに認(rèn)証ウィンドウがポップアップ表示され、 userInfo は、ユーザーが同意した後に返されます。このインターフェイスは、wx.getUserInfo を置き換えるために使用されます。詳細(xì)については、ユーザー情報インターフェイスの調(diào)整手順を參照してください。

  • wx.checkSession(Object object)

    ログイン狀態(tài)の有効期限が切れているかどうかを確認(rèn)します。 wx.login インターフェースを通じて取得されるユーザーのログインステータスには、一定の適時性があります。ユーザーがミニ プログラムを使用していない期間が長いほど、ユーザーのログイン ステータスが無効になる可能性が高くなります。一方、ユーザーがミニプログラムを使用している場合、ユーザーのログイン狀態(tài)は常に有効のままです。特定のタイミング ロジックは WeChat によって維持され、開発者には透過的です。開発者は、wx.checkSession インターフェイスを呼び出して、現(xiàn)在のユーザーのログイン ステータスが有効かどうかを確認(rèn)するだけで済みます。

    ログイン狀態(tài)の有効期限が切れた後、開発者は wx.login を呼び出して新しいユーザーのログイン狀態(tài)を取得できます。呼び出しが成功した場合は、現(xiàn)在の session_key の有効期限が切れていないことを示し、呼び出しが失敗した場合は、session_key の有効期限が切れたことを示します。その他の利用方法については、

    ミニプログラムログイン

    をご覧ください。

  • wx.login(Object object)

    インターフェースを呼び出して、ログイン資格情報 (コード) を取得します。ユーザーのログイン ステータス情報はバウチャーを通じて交換されます。これには、現(xiàn)在のミニ プログラムでのユーザーの一意の ID (openid)、WeChat オープン プラットフォーム アカウントでの一意の ID (現(xiàn)在のミニ プログラムが WeChat オープン プラットフォームにバインドされている場合は、unionid) が含まれます。アカウント)とこのログイン、セッションキー(session_key)など。ユーザーデータ通信の暗號化と復(fù)號化はセッションキーに依存します。その他の利用方法については、

    ミニプログラムログイン

    をご覧ください。

#バックエンド ログイン インターフェイス コードの実裝

バックエンドは、NodeJS、Web フレームワーク KOA バージョン ^2.13 を使用します。 4、ルーティング フレームワーク @koa/router バージョン ^10.1.1、フレームワーク リクエスト、バージョン ^2.88.2、トークン情報の暗號化と復(fù)號化に jsonwebtoken が使用されます、バージョン ^8.5.1

// app.js
const Koa = require("koa");
const Router = require("@koa/router");
const WeixinAuth = require("./lib/koa2-weixin-auth");
const jsonwebtoken = require("jsonwebtoken");

const app = new Koa();
// 小程序機(jī)票信息
const miniProgramAppId = "*********";
const miniProgramAppSecret = "***********";
const weixinAuth = new WeixinAuth(miniProgramAppId, miniProgramAppSecret);

const JWT_SECRET = "JWTSECRET";
// 路由中間件需要安裝@koa/router
// 開啟一個帶群組的路由
const router = new Router({
  prefix: "/user",
});
// 這是正規(guī)的登陸方法
// 添加一個參數(shù),sessionKeyIsValid,代表sessionKey是否還有效
router.post("/weixin-login", async (ctx) => {
  let { code, userInfo, encryptedData, iv, sessionKeyIsValid } =
    ctx.request.body;
   // 解析openid
  const token = await weixinAuth.getAccessToken(code);
  userInfo.openid = token.data.openid;
  // 這里可以自己進(jìn)行處理,比方說記錄到數(shù)據(jù)庫,處理token等
  let authorizationToken = jsonwebtoken.sign(
    { name: userInfo.nickName },
    JWT_SECRET,
    { expiresIn: "1d" }
  );
  Object.assign(userInfo, { authorizationToken });
  ctx.status = 200;
  ctx.body = {
    code: 200,
    msg: "ok",
    data: userInfo,
  };
});
// lib/koa2-weixin-auth.js
const querystring = require("querystring");
const request = require("request");

const AccessToken = function (data) {
  if (!(this instanceof AccessToken)) {
    return new AccessToken(data);
  }
  this.data = data;
};

/*!
 * 檢查AccessToken是否有效,檢查規(guī)則為當(dāng)前時間和過期時間進(jìn)行對比
 *
 * Examples:
 * ```
 * token.isValid();
 * ```
 */
AccessToken.prototype.isValid = function () {
  return (
    !!this.data.session_key &&
    new Date().getTime() < this.data.create_at + this.data.expires_in * 1000
  );
};

/**
 * 根據(jù)appid和appsecret創(chuàng)建OAuth接口的構(gòu)造函數(shù)
 * 如需跨進(jìn)程跨機(jī)器進(jìn)行操作,access token需要進(jìn)行全局維護(hù)
 * 使用使用token的優(yōu)先級是:
 *
 * 1. 使用當(dāng)前緩存的token對象
 * 2. 調(diào)用開發(fā)傳入的獲取token的異步方法,獲得token之后使用(并緩存它)。

 * Examples:
 * ```
 * var OAuth = require(&#39;oauth&#39;);
 * var api = new OAuth(&#39;appid&#39;, &#39;secret&#39;);
 * ```
 * @param {String} appid 在公眾平臺上申請得到的appid
 * @param {String} appsecret 在公眾平臺上申請得到的app secret
 */
const Auth = function (appid, appsecret) {
  this.appid = appid;
  this.appsecret = appsecret;
  this.store = {};

  this.getToken = function (openid) {
    return this.store[openid];
  };

  this.saveToken = function (openid, token) {
    this.store[openid] = token;
  };
};

/**
 * 獲取授權(quán)頁面的URL地址
 * @param {String} redirect 授權(quán)后要跳轉(zhuǎn)的地址
 * @param {String} state 開發(fā)者可提供的數(shù)據(jù)
 * @param {String} scope 作用范圍,值為snsapi_userinfo和snsapi_base,前者用于彈出,后者用于跳轉(zhuǎn)
 */
Auth.prototype.getAuthorizeURL = function (redirect_uri, scope, state) {
  return new Promise((resolve, reject) => {
    const url = "https://open.weixin.qq.com/connect/oauth2/authorize";
    let info = {
      appid: this.appid,
      redirect_uri: redirect_uri,
      scope: scope || "snsapi_base",
      state: state || "",
      response_type: "code",
    };
    resolve(url + "?" + querystring.stringify(info) + "#wechat_redirect");
  });
};

/*!
 * 處理token,更新過期時間
 */
Auth.prototype.processToken = function (data) {
  data.create_at = new Date().getTime();
  // 存儲token
  this.saveToken(data.openid, data);
  return AccessToken(data);
};

/**
 * 根據(jù)授權(quán)獲取到的code,換取access token和openid
 * 獲取openid之后,可以調(diào)用`wechat.API`來獲取更多信息
 * @param {String} code 授權(quán)獲取到的code
 */
Auth.prototype.getAccessToken = function (code) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/jscode2session";
    //由于此框架版本很久沒有更新了,此處地址發(fā)生了變化,需要修改為以上地址,不然會出現(xiàn)
    //41008錯誤。這也是沒有直接使用框架,引用本地使用的原因。
    // const url = "https://api.weixin.qq.com/sns/oauth2/access_token";
    const info = {
      appid: this.appid,
      secret: this.appsecret,
      js_code: code,
      grant_type: "authorization_code",
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        const data = JSON.parse(body);
        resolve(this.processToken(data));
      }
    });
  });
};

/**
 * 根據(jù)refresh token,刷新access token,調(diào)用getAccessToken后才有效
 * @param {String} refreshToken refreshToken
 */
Auth.prototype.refreshAccessToken = function (refreshToken) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/oauth2/refresh_token";
    var info = {
      appid: this.appid,
      grant_type: "refresh_token",
      refresh_token: refreshToken,
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        const data = JSON.parse(body);
        resolve(this.processToken(data));
      }
    });
  });
};

/**
 * 根據(jù)openid,獲取用戶信息。
 * 當(dāng)access token無效時,自動通過refresh token獲取新的access token。然后再獲取用戶信息
 * @param {Object|String} options 傳入openid或者參見Options
 */
Auth.prototype.getUser = async function (openid) {
  const data = this.getToken(openid);
  console.log("getUser", data);
  if (!data) {
    var error = new Error(
      "No token for " + options.openid + ", please authorize first."
    );
    error.name = "NoOAuthTokenError";
    throw error;
  }
  const token = AccessToken(data);
  var accessToken;
  if (token.isValid()) {
    accessToken = token.data.session_key;
  } else {
    var newToken = await this.refreshAccessToken(token.data.refresh_token);
    accessToken = newToken.data.session_key;
  }
  console.log("accessToken", accessToken);
  return await this._getUser(openid, accessToken);
};

Auth.prototype._getUser = function (openid, accessToken, lang) {
  return new Promise((resolve, reject) => {
    const url = "https://api.weixin.qq.com/sns/userinfo";
    const info = {
      access_token: accessToken,
      openid: openid,
      lang: lang || "zh_CN",
    };
    request.post(url, { form: info }, (err, res, body) => {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.parse(body));
      }
    });
  });
};

/**
 * 根據(jù)code,獲取用戶信息。
 * @param {String} code 授權(quán)獲取到的code
 */
Auth.prototype.getUserByCode = async function (code) {
  const token = await this.getAccessToken(code);
  return await this.getUser(token.data.openid);
};

module.exports = Auth;

ミニプログラムターミナルのログインコードの実裝

<!--pages/index.wxml-->
<view class="page-section">
    <text class="page-section__title">微信登錄</text>
    <view class="btn-area">
        <button  bindtap="getUserProfile" type="primary">登錄</button>
    </view>
</view>
// pages/index.js
Page({
  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {},
  // 正確的登錄方式
  getUserProfile() {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認(rèn)
    // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復(fù)彈窗
    wx.getUserProfile({
      desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹(jǐn)慎填寫
      success: (res) => {
        let { userInfo, encryptedData, iv } = res;
        const requestLoginApi = (code) => {
          // 發(fā)起網(wǎng)絡(luò)請求
          wx.request({
            url: "http://localhost:3000/user/weixin-login",
            method: "POST",
            header: {
              "content-type": "application/json",
            },
            data: {
              code,
              userInfo,
              encryptedData,
              iv,
            },
            success(res) {
              console.log("請求成功", res.data);
              let token = res.data.data.authorizationToken;
              wx.setStorageSync("token", token);
              onUserLogin(token);
              console.log("authorization", token);
            },
            fail(err) {
              console.log("請求異常", err);
            },
          });
        };
        const onUserLogin = (token) => {
          getApp().globalData.token = token;
          wx.showToast({
            title: "登錄成功了",
          });
        };
        //必須進(jìn)行session是否過期檢查,不然會出現(xiàn)第一次點(diǎn)擊登錄,服務(wù)器報Illegal Buffer
        //的錯誤,但是第二次點(diǎn)擊登錄正常。
        wx.checkSession({
          success: (res) => {
            // session_key 未過期,并且在本生命周期一直有效
            console.log("在登陸中");
            let token = wx.getStorageSync("token");
            if (token) onUserLogin(token);
          },
          fail: (res) => {
            // session_key已經(jīng)失效,需要重新執(zhí)行登錄流程
            wx.login({
              success(res0) {
                if (res0.code) {
                  requestLoginApi(res0.code);
                } else {
                  console.log("登錄失敗!" + res0.errMsg);
                }
              },
            });
          },
        });
      },
    });
  },
});

ログインコードに対してどのような最適化が可能ですか?

ソフトウェアの場合、コード レベルで最も基本的な側(cè)面を追求する必要があります (これらよりもはるかに多くの側(cè)面がありますが、最初にこれらの側(cè)面をしっかりと理解しましょう):

Maintainability (保守性)
  • いわゆる「メンテナンス」とは、バグを修正したり、古いコードを修正したり、新しいコードを追加したりする作業(yè)にほかなりません。いわゆる「コードの保守が容易である」とは、元のコード設(shè)計を破壊したり、新しいバグを?qū)毪筏郡辘工毪长趣胜?、コードを迅速に変更または追加できることを意味します。いわゆる「コードの保守が容易ではない」とは、コードの変更や追加には新たなバグが発生する大きなリスクがあり、完了までに長い時間がかかることを意味します。

    可読性 (可読性)
  • ソフトウェア設(shè)計の第一人者、マーティン?ファウラーはかつてこう言いました。 .」 中國語訳:「どんな愚か者でもコンピュータが理解できるコードを書くことができる。優(yōu)れたプログラマは人間が理解できるコードを書くことができる。」 Google 內(nèi)には Readability と呼ばれる認(rèn)定資格さえあります。この認(rèn)定を取得したエンジニアのみが、コードレビュー中に他の人がコードを提出することを承認(rèn)する資格を持ちます。コードの読みやすさがいかに重要であるかがわかりますが、結(jié)局のところ、コードが書かれて実行される回數(shù)よりも読み取られる回數(shù)のほうがはるかに多いのです。コードがコーディング規(guī)約に準(zhǔn)拠しているか、意味のあるネーミングか、コメントが詳細(xì)か、関數(shù)の長さは適切か、モジュール分けは明確か、高凝集性?低結(jié)合性を満たしているかなどを確認(rèn)する必要があります。

    拡張性 (拡張性)
  • 拡張性も、コードの品質(zhì)を評価するための非常に重要な基準(zhǔn)です。コードにはいくつかの関數(shù)拡張ポイントが確保されており、関數(shù)を追加するためだけに多大な労力を費(fèi)やして元のコードを大幅に変更することなく、新しい関數(shù)コードを拡張ポイントに直接挿入できます。

    再利用性
  • 代碼的可復(fù)用性可以簡單地理解為,盡量減少重復(fù)代碼的編寫,復(fù)用已有的代碼。

那么接下來就來優(yōu)化一下代碼吧:

模塊化

可以把登錄的代碼模塊化,代碼如下:

// lib/login.js
function loginWithCallback(cb) {
  // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認(rèn)
  // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復(fù)彈窗
  wx.getUserProfile({
    desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹(jǐn)慎填寫
    success: (res) => {
      let { userInfo, encryptedData, iv } = res;
      const requestLoginApi = (code) => {
        // 發(fā)起網(wǎng)絡(luò)請求
        wx.request({
          url: "http://localhost:3000/user/weixin-login",
          method: "POST",
          header: {
            "content-type": "application/json",
          },
          data: {
            code,
            userInfo,
            encryptedData,
            iv,
          },
          success(res) {
            console.log("請求成功", res.data);
            let token = res.data.data.authorizationToken;
            wx.setStorageSync("token", token);
            onUserLogin(token);
            console.log("authorization", token);
          },
          fail(err) {
            console.log("請求異常", err);
          },
        });
      };

      const onUserLogin = (token) => {
        getApp().globalData.token = token;
        wx.showToast({
          title: "登錄成功了",
        });
        if (cb && typeof cb == "function") cb(token);
      };
      wx.checkSession({
        success: (res) => {
          // session_key 未過期,并且在本生命周期一直有效
          console.log("在登陸中");
          let token = wx.getStorageSync("token");
          if (token) onUserLogin(token);
        },
        fail: (res) => {
          // session_key已經(jīng)失效,需要重新執(zhí)行登錄流程
          wx.login({
            success(res0) {
              if (res0.code) {
                requestLoginApi(res0.code);
              } else {
                console.log("登錄失敗!" + res0.errMsg);
              }
            },
          });
        },
      });
    },
  });
}

export default loginWithCallback;

Promise化

回調(diào)地獄問題,不利于代碼的閱讀,所以接下來我們基于Promise進(jìn)行代碼優(yōu)化。有了 Promise 對象,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise 對象提供統(tǒng)一的接口,使得控制異步操作更加容易。

Promise的幾個方法簡介

#メソッド名説明##Promise.prototype.thenPromise.prototype.catchPromise.prototype.finally#Promise.allthen()Promise.racePromise.anyPromise.allSettledrejected# された場合に値を返します。 ## の後の Promise にはオブジェクトの配列が伴い、各オブジェクトは対応する Promise の結(jié)果を表します。対照的に、
このメソッドは新しい Promise オブジェクトを返すため、連鎖的に記述することができます。この設(shè)計により、コールバック関數(shù)の「水平開発」から「下方開発」まで、ネストされた非同期操作を簡単に書き直すことができます。
は、Promise.prototype.then(null、rejection) のエイリアスで、エラーがいつ発生するかを指定するために使用されます。コールバックが発生します。 Promise オブジェクトのエラーには「バブル」の性質(zhì)があり、検出されるまで逆方向に伝播します。つまり、エラーは常に次の catch ステートメントによってキャッチされます。
メソッドは Promise を返します。 Promise の終了時には、結(jié)果が満たされたか拒否されたかに関係なく、指定されたコールバック関數(shù)が実行されます。これにより、Promise が正常に完了するかどうかに関係なく、コードを?qū)g行する必要がある方法が提供されます。
これにより、## で同じステートメントを使用する必要がなくなります。 # と catch() はそれぞれ 1 回ずつ書き込まれます。 Promise.all メソッドは、複數(shù)の Promise インスタンスを新しい Promise インスタンスにラップするために使用されます。 Promise.all メソッドは配列をパラメーターとして受け入れます。 var p = Promise.all([p1,p2,p3]);p1、p2、p3 はすべて Promise オブジェクトのインスタンスです。 (Promise.all メソッドのパラメーターは必ずしも配列である必要はありませんが、イテレーター インターフェイスが必要であり、返される各メンバーは Promise インスタンスです。) p の狀態(tài)は、p1、p2、および p3 によって決定され、次のように分割されます。 2つの狀況。 (1) p1、p2、p3 の狀態(tài)がすべて満たされた場合にのみ、p の狀態(tài)が満たされます このとき、p1、p2、p3 の戻り値は配列を形成し、 pのコールバック関數(shù)。 (2) p1、p2、p3 のいずれかが拒否されると、p の狀態(tài)は拒否されますが、このとき最初に拒否されたインスタンスの戻り値が p のコールバック関數(shù)に渡されます。
Promise.race メソッドは、複數(shù)の Promise インスタンスを新しい Promise インスタンスにラップします。 var p = Promise.race([p1,p2,p3]);上記のコードでは、p1、p2、p3 のうちの 1 つのインスタンスが最初に狀態(tài)を変更する限り、p の狀態(tài)が変更されます。それに応じて。 pの戻り値には、最初に変更されたPromiseインスタンスの戻り値が渡されます。
Promise 反復(fù)可能オブジェクトを受け取り、Promise の 1 つが成功する限り、成功した Promise が返されます。すべてのサブインスタンスは拒否された狀態(tài)になり、Promise 全體も拒否された狀態(tài)になります。
指定されたすべての Promise が fulfilled または Promise.all() は、相互の依存関係、またはいずれかの依存関係が reject になったときにすぐに終了する場合により適しています。

小程序API接口Promise化并且把需要登錄的調(diào)用接口模塊化

1、安裝插件。請先查看npm支持文檔。

npm install --save miniprogram-api-promise

2、在微信開發(fā)者工具右方詳情中勾選使用npm模塊,并在菜單欄工具中點(diǎn)擊構(gòu)建npm。

3、初始化代碼。

// app.js
import {promisifyAll} from &#39;miniprogram-api-promise&#39;
import login from "../lib/login";
const wxp ={}
promisifyAll(wx,wxp)
// 需要token的請求統(tǒng)一處理登錄和設(shè)置header,并且處理錯誤信息
wxp.requestNeedLogin = async function (args) {
  let token = wx.getStorageSync("token");
  if (!token) {
    token = await loginWithPromise();
  }
  if (!args.header) args.header = {};
  args.header["Authorization"] = `Bearer ${token}`;
  return wxp.request(args).catch(console.error);
};
// app.js
App({
  wxp:wxp,
});

4、改寫login.js代碼

// lib/login.js
function login() {
  return new Promise((resolve, reject) => {
    // 推薦使用wx.getUserProfile獲取用戶信息,開發(fā)者每次通過該接口獲取用戶個人信息均需用戶確認(rèn)
    // 開發(fā)者妥善保管用戶快速填寫的頭像昵稱,避免重復(fù)彈窗
    wx.getUserProfile({
      desc: "用于完善會員資料", // 聲明獲取用戶個人信息后的用途,后續(xù)會展示在彈窗中,請謹(jǐn)慎填寫
       success:async (res0) => {
        let {
          userInfo,
          encryptedData,
          iv
        } = res0;
        const app = getApp();
        try {
          app.wxp.checkSession();
        } catch (err) {
          reject(err);
        }
        let token = wx.getStorageSync("token");
        if (!token) {
          let res1 = await app.wxp.login().catch(err => reject(err));
          let code = res1.code;
          let res = await app.wxp.request({
            url: "http://localhost:3000/user/weixin-login",
            method: "POST",
            header: {
              "content-type": "application/json",
            },
            data: {
              code,
              userInfo,
              encryptedData,
              iv,
            }
          }).catch(err => reject(err));
          token = res.data.data.authorizationToken;
          wx.setStorageSync("token", token);
          app.globalData.token = token;
          wx.showToast({
            title: "登錄成功了",
          });
          resolve(token);
        }
      },
    });
  })
}

export default login;

5、調(diào)用代碼

<view class="container page-head">
  <text class="page-section__title">需要登錄的請求調(diào)用</text>
  <view class="btn-area">
    <button bindtap="request1" type="primary">請求1</button>
    <button bindtap="request2" type="primary">請求2</button>
  </view>
</view>
// pages/index.js
Page({
  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {},
  request1() {
    getApp().wxp.requestNeedLogin({
        url: "http://localhost:3000/user/home?name=andying",
      }).then(console.log)
  },
  request2() {
    getApp().wxp.requestNeedLogin({
        url: "http://localhost:3000/user/home?name=eva",
      }).then(console.log)
  },
});

【相關(guān)學(xué)習(xí)推薦:小程序開發(fā)教程

以上がミニプログラムでログイン機(jī)能を?qū)g裝する方法の簡単な分析の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

小紅書で以前のアカウントにログインするにはどうすればよいですか?再接続後に元の番號が失われた場合はどうすればよいですか? 小紅書で以前のアカウントにログインするにはどうすればよいですか?再接続後に元の番號が失われた場合はどうすればよいですか? Mar 21, 2024 pm 09:41 PM

ソーシャル メディアの急速な発展に伴い、Xiaohongshu は多くの若者が生活を共有し、新製品を探索するための人気のプラットフォームになりました。使用中に、ユーザーが以前のアカウントにログインできない場合があります。この記事では、Xiaohongshuで古いアカウントにログインできない問題の解決方法と、バインドを変更した後に元のアカウントが失われる可能性への対処方法について詳しく説明します。 1. 小紅書の前のアカウントにログインするにはどうすればよいですか? 1. パスワードを取得してログインします。Xiaohongshu に長期間ログインしない場合、アカウントがシステムによってリサイクルされる可能性があります。アクセス権を復(fù)元するには、パスワードを取得してアカウントへのログインを再試行します。操作手順は以下の通りです。 (1) 小紅書アプリまたは公式サイトを開き、「ログイン」ボタンをクリックします。 (2) 「パスワードを取得」を選択します。 (3) アカウント登録時に使用した攜帯電話番號を入力してください

壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? 壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? Mar 19, 2024 pm 02:00 PM

自分のコンピュータで他人の Steam アカウントにログインし、その他人のアカウントに壁紙ソフトウェアがインストールされている場合、自分のアカウントに切り替えた後、Steam は他人のアカウントに登録されている壁紙を自動的にダウンロードします。 Steam クラウドの同期をオフにします。別のアカウントにログインした後に、wallpaperengine が他の人の壁紙をダウンロードした場合の対処方法 1. 自分の steam アカウントにログインし、設(shè)定でクラウド同期を見つけて、steam クラウド同期をオフにします。 2. 以前にログインしたことのある他の人の Steam アカウントにログインし、壁紙クリエイティブ ワークショップを開き、サブスクリプション コンテンツを見つけて、すべてのサブスクリプションをキャンセルします。 (將來壁紙が見つからない場合は、まず壁紙を収集してからサブスクリプションをキャンセルできます) 3. 自分の Steam に戻ります。

Kuaishou PC 版へのログイン方法 - Kuaishou PC 版へのログイン方法 Kuaishou PC 版へのログイン方法 - Kuaishou PC 版へのログイン方法 Mar 04, 2024 pm 03:30 PM

最近、何人かの友人が Kuaishou コンピュータ版へのログイン方法を?qū)い亭皮蓼筏?。ここで?Kuaishou コンピュータ版へのログイン方法を説明します。必要な友人が來て、さらに詳しく學(xué)ぶことができます。ステップ 1: まず、コンピュータのブラウザで Baidu の Kuaishou 公式 Web サイトを検索します。ステップ 2: 検索結(jié)果リストの最初の項目を選択します。ステップ 3: Kuaishou 公式ウェブサイトのメインページに入った後、ビデオオプションをクリックします。ステップ 4: 右上隅にあるユーザーのアバターをクリックします。ステップ 5: QR コードをクリックして、ポップアップ ログイン メニューでログインします。ステップ 6: 次に、攜??帯電話で Kuaishou を開き、左上隅のアイコンをクリックします。ステップ 7: QR コードのロゴをクリックします。ステップ 8: My QR コード インターフェイスの右上隅にあるスキャン アイコンをクリックした後、コンピューター上の QR コードをスキャンします。ステップ 9: 最後に、Kuaishou のコンピュータ版にログインします。

『陰陽師』茨木童子のコレクションスキンはログインするとすぐに入手できるほか、新スキン「禪心雲(yún)鏡」も近日登場予定! 『陰陽師』茨木童子のコレクションスキンはログインするとすぐに入手できるほか、新スキン「禪心雲(yún)鏡」も近日登場予定! Jan 05, 2024 am 10:42 AM

山野に數(shù)千の亡霊の叫び聲が響き、武器を取り交わす音が消え、闘志を胸に山を越えて駆けつけた亡霊將軍たちは火をラッパに吹き、數(shù)百の亡霊を率いて突撃した。戦いへ。 【烈火の梅蓮?茨木童子コレクションスキンがオンライン販売開始】 炎が燃え盛る幽霊の角、荒々しい闘志がほとばしる金色の瞳、そしてシャツを彩る白翡翠の甲冑は、偉大なる者の手に負(fù)えない野性的な勢いを表しています。悪魔。雪のように白くはためく袖には、赤い炎が絡(luò)みつき、金の模様が刻まれ、紅く幻想的な色を燈した。凝縮された悪魔の力によって形成された意志のウィスプが咆哮し、激しい炎が山を揺るがしました煉獄から戻った悪魔と幽霊、一緒に侵入者を懲らしめましょう。 【専用ダイナミックアバターフレーム?烈火の炎のバイリアン】 【専用イラスト?花火將軍魂】 【伝記鑑賞】 【入手方法】 茨木童子のコレクションスキン?烈火の炎のバイリアンは、12月28日メンテナンス後よりスキンストアに登場いたします。

バックグラウンドログインの問題の解決策を明らかにする バックグラウンドログインの問題の解決策を明らかにする Mar 03, 2024 am 08:57 AM

Discuz のバックグラウンド ログイン問題の解決策が明らかになりました。特定のコード サンプルが必要です。インターネットの急速な発展に伴い、Web サイトの構(gòu)築がますます一般的になってきました。Discuz は、一般的に使用されるフォーラム Web サイト構(gòu)築システムとして、次のユーザーに好まれています。多くのウェブマスター。しかし、その強(qiáng)力な機(jī)能ゆえに、Discuz を使用する際にバックグラウンドでのログインの問題などの問題が発生することがあります。本日は、Discuz のバックグラウンド ログインの問題の解決策を明らかにし、具體的なコード例を提供します。

小紅書がアカウントしか覚えていない場合、ログインするにはどうすればよいですか?アカウントを取得する方法を覚えていますか? 小紅書がアカウントしか覚えていない場合、ログインするにはどうすればよいですか?アカウントを取得する方法を覚えていますか? Mar 23, 2024 pm 05:31 PM

小紅書は現(xiàn)在、多くの人々の日常生活に溶け込んでおり、その豊富なコンテンツと便利な操作方法でユーザーは楽しんでいます。アカウントのパスワードを忘れてしまうこともありますが、アカウントだけは覚えているのにログインできないのはとても困ります。 1. Xiaohonshu がアカウントしか覚えていない場合、ログインするにはどうすればよいですか?パスワードを忘れた場合は、攜帯電話の確認(rèn)コードを使用して小紅書にログインできます。具體的な操作は次のとおりです: 1. 小紅書アプリまたはウェブ版の小紅書を開きます; 2. 「ログイン」ボタンをクリックし、「アカウントとパスワードでログイン」を選択します; 3. 「パスワードをお忘れですか?」ボタンをクリックします; 4.アカウント番號を入力して「次へ」をクリックします; 5. システムから攜帯電話に確認(rèn)コードが送信されますので、確認(rèn)コードを入力して「OK」をクリックします; 6. 新しいパスワードを設(shè)定して確認(rèn)します。サードパーティのアカウント (次のような) を使用することもできます。

Baidu Netdisk Web バージョンに入るにはどうすればよいですか? Baidu Netdisk Web 版ログイン入口 Baidu Netdisk Web バージョンに入るにはどうすればよいですか? Baidu Netdisk Web 版ログイン入口 Mar 13, 2024 pm 04:58 PM

Baidu Netdisk は、さまざまなソフトウェア リソースを保存できるだけでなく、他のユーザーと共有することもできます。複數(shù)端末の同期をサポートしています。コンピュータにクライアントがダウンロードされていない場合は、Web バージョンに入ることができます。では、Baidu Netdisk Web バージョンにログインするにはどうすればよいでしょうか?詳しい紹介を見てみましょう。 Baidu Netdisk Web バージョンのログイン入り口: https://pan.baidu.com (リンクをコピーしてブラウザで開きます) ソフトウェアの紹介 1. 共有 ファイル共有機(jī)能を提供し、ユーザーはファイルを整理し、必要な友人と共有できます。 2. クラウド: メモリをあまり消費(fèi)せず、ほとんどのファイルはクラウドに保存されるため、コンピュータのスペースを効果的に節(jié)約できます。 3. フォト アルバム: クラウド フォト アルバム機(jī)能をサポートし、寫真をクラウド ディスクにインポートし、全員が閲覧できるように整理します。?

WeChat ミニ プログラムにカードめくり効果を?qū)g裝する WeChat ミニ プログラムにカードめくり効果を?qū)g裝する Nov 21, 2023 am 10:55 AM

WeChat ミニ プログラムでのカードめくり効果の実裝 WeChat ミニ プログラムでは、カードめくり効果の実裝は、ユーザー エクスペリエンスとインターフェイス インタラクションの魅力を向上させることができる一般的なアニメーション効果です。以下では、WeChat アプレットでカードめくりの特殊効果を?qū)g裝する方法と、関連するコード例を詳しく紹介します。まず、ミニ プログラムのページ レイアウト ファイルに 2 つのカード要素を定義する必要があります。1 つは前面のコンテンツを表示するため、もう 1 つは背面のコンテンツを表示するためです。具體的なサンプル コードは次のとおりです: &lt;!--index.wxml- ->&l

See all articles