在操作钩子中存储会话 - Loopback

Store session in operation hook - Loopback

我想存储 userIdaccessToken 以外的一些数据以存储在会话中,在 after savebefore save 环回应用程序中的操作挂钩中使用 express-session

我的 server/server.js 里有这个:

....
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
....

app.use(session({
    name:'session-name',
    secret: 'keyboard cat',
    store: new MongoStore({url: 'mongodb://localhost/test', ttl:1}),
    resave: false,
    saveUninitialized: true
}));

并且当我用一些参数定义远程方法时,它实际上传递了参数而不是 req 对象,所以我不能用快速的方式来做。

如何使用会话来存储和获取值?

编辑: 我找到了一种在远程方法中设置会话的方法,方法是将其添加到我的 model.json 的远程方法中:

"accepts": [
    {
        "arg": "req",
        "type": "object",
        "http": {
            "source": "req"
        }
    }
]

并且,将 req 参数添加到远程方法函数,

Model.remoteMethod = function (req, callback) {
    req.session.data = { 'foo': 'bar' }
    callback(null)
};

现在,问题是我想在操作钩子中获取这个会话值

Model.observe('before save', function (ctx, next) {
    //How to get the session here?
})

试试 this now :

可以设置ctx值:

var LoopBackContext = require('loopback-context');

    MyModel.myMethod = function(cb) {
      var ctx = LoopBackContext.getCurrentContext();
      // Get the current access token
      var accessToken = ctx && ctx.get('accessToken');
      ctx.set('xx', { x: 'xxxx' } );

    }

获取ctx值:

 module.exports = function(MyModel) {
      MyModel.observe('access', function(ctx, next) {
        const token = ctx.options && ctx.options.accessToken;
        const userId = token && token.userId;
        const modelName = ctx.Model.modelName;
        const scope = ctx.where ? JSON.stringify(ctx.where) : '<all records>';
        console.log('%s: %s accessed %s:%s', new Date(), user, modelName, scope);
        next();
      });
    };

loopback 上下文存储 userIdaccesTokan。在整个网络中,您可以使用 ctx 进行访问,它的工作方式类似于 session in loopback.