微信小遊戲 後端koa架構mp-session-koa2 解析

微信小遊戲屬於h5小遊戲,本來h5小遊戲是沒有相關的規則比較自由。因爲有了微信的登錄驗證之後加了少許規則進來。這樣後臺也會有所變化。
https://developers.weixin.qq.com/minigame/dev/tutorial/open-ability/login.html

在這裏插入圖片描述
這裏有官方示例的前後登錄驗證流程;
梳理一下你在後端要多兩件事,第一件事,要拿着前端傳來的code和appid/appsecret一起請求微信接口;第二件就是把這拿到的東西放session裏給前端一個id;以後前端有這個就是登錄,沒有這個就下線了。

我們常規寫的nodejs項目是自己的session,但是如果你要做以上的驗證你用的常規session是要加以改造的,因爲
我們用的相關信息會長期呆在session裏。今天我實現這個session用的是mp-session-koa2。

我們先安裝mp-session-koa2插件npm i mp-session-koa2 -save;
裝好後可以看到 index.js的第141行:

const { sessionKey, openId } = await login({ appId, appSecret, code });

可以看到這個插件是最新的支持es7 await的;這一句就是請求微信的API;login是另一個js文件調用;

const res = await axios.get(exchangeUrl, {
    responseType: 'json',
  }).catch((e) => {
    throw e;
  });

login這一段res即是微信返你的res,裏面的openid session_key是我們需要的東東了;

這個插件默認是支持redis的,session將會存在redis裏,真正在開發的時候我們的redis一般會有安全驗證,這樣我們手工加上自己的安全密碼,redisStore.js是我們要動的文件;

this.redis = new Redis();

初始化時這裏需要加,我們可以略爲加以改造;

之前的項目一直用這個插件,wafer-node-session,那個是在express下跑,m但有個很大的不足,即他造的session,是不能修改的。
req.session.xxx = xxxx;這種賦值將失敗;關於這個問題我在官方論壇留言官方給出了mp-session-koa2這個插件,現在來說確如官方所說,現在mp是在koa下跑,ctx.session.xxx= xxx ;這種賦值是可以實現了;這個後端才真正完整,如果session這個主要的共享工具不能存數據,是多麼的難受。

// 保存原始的session數據
      const oldSession = _.cloneDeep(ctx.session);
      await next();

      const newSession = ctx.session;
      if (_.isEqual(oldSession, newSession)) return;

      //儲存新的session數據
      if (!newSession || _.isEmpty(newSession)) {
        await Promise.resolve(store.destroy(id, ctx)).catch((e) => {
          throw e;
        });
        ctx.cookies.set(constants.WX_HEADER_ID, null);
        return;
      }
      const ops = Object.assign({}, options, { sid: id });
      const sid = await Promise.resolve(store.set(ctx.session, ops, ctx));
      ctx.cookies.set(constants.WX_HEADER_ID, sid, options);

這裏這mp實現新數據存儲的邏輯,_ 是lodash,以上大致的意思是如果跑完用戶的接口後,session不是以前的將會再存一下新的;這是在以前wafer-node-session沒有的邏輯;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章