微信小游戏 后端koa架构mp-session-koa2 解析

微信小游戏属于h5小游戏,本来h5小游戏是没有相关的规则比较自由。因为有了微信的登录验证之后加了少许规则进来。这样后台也会有所变化。
https://developers.weixin.qq.com/minigame/dev/tutorial/open-ability/login.html

微信小游戏 后端koa架构mp-session-koa2 解析_第1张图片
这里有官方示例的前后登录验证流程;
梳理一下你在后端要多两件事,第一件事,要拿着前端传来的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没有的逻辑;

你可能感兴趣的:(异步,nodejs,koa)