从模型可覆盖的访问环回上下文/请求

时间:2016-09-28 10:40:51

标签: loopbackjs

如何从模型的逻辑中访问环回上下文(或简单的Express req对象)?

能够在模型逻辑中更多地了解请求本身(当前用户身份比其他任何事情更重要)至关重要。当我覆盖内置方法(通过自定义脚本或从model.js文件)或开发自定义远程方法时,我想访问Express req对象。

由于loopback.getCurrentContext()被声明为bug,我无法使用它。

想法?

PS: 我发现此页面令人困惑:http://loopback.io/doc/en/lb2/Using-current-context.html

首先它说(并用红色标记为重要!)不建议使用LoopBackContext.getCurrentContext()然后它在每个例子中使用它!?

提供不起作用的示例有什么意义?我们应该忽略整个页面吗?如果是这样,背景如何? :)

非常感谢对此主题的任何澄清。

2 个答案:

答案 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