如何从模型的逻辑中访问环回上下文(或简单的Express req对象)?
能够在模型逻辑中更多地了解请求本身(当前用户身份比其他任何事情更重要)至关重要。当我覆盖内置方法(通过自定义脚本或从model.js文件)或开发自定义远程方法时,我想访问Express req对象。
由于loopback.getCurrentContext()被声明为bug,我无法使用它。
想法?
PS: 我发现此页面令人困惑:http://loopback.io/doc/en/lb2/Using-current-context.html
首先它说(并用红色标记为重要!)不建议使用LoopBackContext.getCurrentContext()然后它在每个例子中使用它!?
提供不起作用的示例有什么意义?我们应该忽略整个页面吗?如果是这样,背景如何? :)
非常感谢对此主题的任何澄清。
答案 0 :(得分:0)
您可以使用远程挂钩
访问express req对象var loopback = require('loopback');
module.exports = function (MyModel) {
MyModel.beforeRemote('findOne', function (ctx, model, next) {
//access to ctx.req
console.log(ctx.req.headers)
next()
})
MyModel.beforeRemote('my-custom-remote-method', function (ctx, model, next) {
console.log(ctx.req.headers)
next()
})
}
答案 1 :(得分:0)
当然,您可以使用beforeRemote
挂钩来修改ctx.args
属性。此属性是远程方法的输入(即自定义或内置)。这样,您可以在此属性中复制请求的一部分,并将其传递给内置方法
示例1 ,内置方法findOne
。
MyModel.beforeRemote('findOne', function (ctx, model, next) {
ctx.args.filter.extrafield = ctx.req.headers['some-header'];
next();
});
然后override使用findOne方法,因为这是你想做的事情
MyModel.on('dataSourceAttached', function(obj){
var findOne = MyModel.findOne;
MyModel.findOne = function(filter, cb) {
console.log(filter.extrafield); // Print what was in the header
return findOne.apply(this, arguments);
};
});
最后用curl调用方法
curl -H "some-header: 'hello, world!'" localhost:3000/api/MyModel/findOne
示例2 ,使用自定义远程printToken
,以帮助您进一步了解
MyModel.beforeRemote('printToken', function (ctx, model, next) {
ctx.args.token = ctx.req.headers['some-header'];
next();
});
MyModel.printToken = function(token, cb) {
console.log(token);
cb();
}
MyModel.remoteMethod(
'printToken',
{
accepts: {arg: 'token', type: 'string', optional: true}
}
);
然后用curl调用遥控器,并传递预期的标题
curl -H "some-header: 'hello, world!'" localhost:3000/api/MyModel/printToken
编辑:有一个更简单的解决方案,仅适用于自定义远程
定义远程方法时,可以告诉loopback将http请求的元素作为输入参数直接传递给远程
MyModel.remoteMethod(
'printToken',
{
accepts: [
{arg: 'req', type: 'object', 'http': {source: 'req'}},
{arg: 'res', type: 'object', 'http': {source: 'res'}}
]
}
);
这样,您的遥控器就可以访问req和res对象。记录在案here