似乎操作挂钩"访问"不包含ctx.req
对象。
我想要实现的是会话数据应该在所有模型中都可用。
中间件中定义的会话:
"session": {
"express-session": {
"params": {
"secret": "mysceret",
"saveUninitialized": true,
"resave": true
}
}
}
在 User.js :
中req.session.user = userData;
并访问Post
模型中的会话:
Post.observe('access', function(ctx, next) {
console.log('ctx.req : ' , ctx.req) // undefined
ctx.query.filter = { tenantId: ctx.req.session.user.tenantId };
// so cannot able to find session data here.
next();
});
快递会话:"express-session": "^1.15.6"
环回版本:"loopback": "^3.0.0"
我缺少什么或者我以错误的方式访问会话? 请帮忙。
由于
答案 0 :(得分:0)
我要在accessing current logged in user id in custom route in loopback
处大量借用我的回答操作挂钩上下文接受您提交给它的值,如 以及与模型相关的一些默认值,它永远不会有 userId默认情况下。 https://loopback.io/doc/en/lb3/Operation-hooks.html#operation-hook-context-object
操作挂钩中的ctx
不与远程方法中的ctx
相同。
如果要传递其他操作挂钩上下文值,则必须手动调用模型方法并将其作为第二个参数发送。
model.create({color: 'red'}, {contextValue: 'contextValue', anotherContextValue: 'anotherContextValue'}, (err, obj) => {
// Callback things...
}
答案 1 :(得分:0)
如果您已登录,操作挂钩可以从ctx.options
中读取accessToken:
https://loopback.io/doc/en/lb3/Using-current-context.html#access-the-context-from-operation-hooks
Model.observe('access', async ctx => {
let {options: {accessToken = {}} = {}, ...otherAttributes} = ctx;
console.log(accessToken);
});
由于中间件具有对"routes:before"
和req
的访问权限,因此甚至可以使用钩在req.accessToken
部分上的中间件来设置accessToken的某些属性。
您的中间件可能会说:
module.exports = function() {
return function setSession(req, res, next) {
let {accessToken} = req;
accessToken.session = req.session;
next();
};
};
however
,如果您已经在做:
req.session.user = userData;
要将当前用户的值存储到会话中,您可以使用accessToken.user()
来访问该用户,无论您在何处可以获得对有关令牌的引用。