Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

mp-session-koa2

04swjxy10MIT0.4.0

node koa2 session middleware for wechat micro application

wechat micro application, koa2, session, redis, store, middleware

readme

mp-session-koa2

微信小程序服务器端 处理来自微信小程序的登录请求并建立和维护会话,适用于koa2框架. 并支持向session中添加自定义字段.

说明

该模块是根据微信小程序官方服务器端session模块wafer-node-session并结koa-session2模块合修改而来. 由于官方wafer-node-session只支持express框架.通过修改后,本模块支持koa2框架.

获取和安装

npm install mp-session-koa2

Usage

用法与官方wafer-node-session模块基本一致.

const Koa = require('koa');
const { sessionMp } = require('mp-session-koa2');

const option = {
  appId: '', // 小程序 appId, 必填
  appSecret: '', // 小程序 appSecret, 必填
  grant_type: 'authorization_code',
  loginPath: '/api/login', // 登录地址, 可以自定义自己的登录路径
  maxAge: 1 * 3600,  //自动过期时间, 单位秒
  coverTime: 300, //since v0.2.0,用户发起任何请求时,session有效时间<=coverTime时, 重新设置maxAge
  loginNext: false, //since v0.3.0,是否允许登录成功后, 传递给下一步.默认为否.一般用于用户信息初始化,和向ctx.session中添加信息.下一步处理函数中不可以使用ctx.body发送数据, 否则导致报错, 登录不成功
  compareByJSON: false, //since v0.4.0 默认为false.是否用JSON.stringify(session)复制session,进行比较
  debug: false, //打印debug信息
  store: null, //选填, 如果为空值, 默认储存在内存中. 推荐使用redis
};
// 有时session比较复杂,导致用_.cloneDeep报错.可以尝试设置compareByJSON:true.
// 比如在Egg.js中使用,就会报错.可以设置为compareByJSON:true

const app = new Koa();

app.use(sessionMp(option));

app.use((ctx, next) => {
  if(ctx.session.userInfo){
    if (!ctx.session.userInfo.userId) {
      // 可以添加添加自定义数据 到session中
      // 该用户下一次访问时, session中将带有自定义的数据
      ctx.session.userInfo.userId = 'testId12345'
    }
    next();
  } else {
    ctx.throw(401,'未登录');
  }
})
// 测试是否能正常获取数据
app.use(async (ctx, next) => {
  const {pathname} = url.parse(ctx.request.url);
  if (pathname === '/api/test') {
    const { userInfo } = ctx.session;
    console.log(userInfo);
    ctx.body = { userInfo };
    return;
  }
})

// http服务
app.listen(8080, () => {
  console.log(`appService is listening at 8080`);
});

使用redis持久化

const { redisStore } = require('mp-session-koa2');


const option = {
  appId: '', // 小程序 appId, 必填
  appSecret: '', // 小程序 appSecret, 必填
  grant_type: 'authorization_code',
  loginPath: '/api/login', // 登录地址, 可以自定义自己的登录路径
  maxAge: 1 * 3600,  //自动过期时间, 单位秒
  coverTime: 5 * 60, //当本次请求session剩余时间<=coverTime时, 重新设置session有效时间为maxAge
  loginNext: false, //是否允许登录成功后, 传递给下一步.默认为否.一般用于用户信息初始化,和向ctx.session中添加信息.下一步处理函数中不可以使用ctx.body发送数据, 否则导致报错, 登录不成功
  store: new redisStore({
    port: 6379,          // Redis port
    host: '127.0.0.1',   // Redis host
    family: 4,           // 4 (IPv4) or 6 (IPv6)
    password: 'auth',
    db: 0
  }),
};

以上代码中的redisStore模块是redis数据库持久化模块,需要先安装redis数据.更详细的redisStore参数设置可以参考ioredis.

store同时也支持其他兼容koa-session2模块的store.例如koa-session2-mongodb.

客户端配合

与官方模块一样,客户端也需要wafer-client-sdk发起请求才能正常建立会话.具体用法请参考官方文档.

测试模型

example目录中有一个简易的测试模型.

客户端: 用小程序开发工具打开example/client目录.在工具中将appId修改为自己的值.

服务器端: example/server/config 是服务器的配置参数. 其中appId和appSecret必须填写自己的值. 进入到example/server 目录后, npm install 安装依赖模块后, npm run dev, 启动服务器.