【问题标题】:Access loopback context/request from the model overridables从模型覆盖访问环回上下文/请求
【发布时间】:2016-10-04 16:42:45
【问题描述】:

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

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

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

想法?

PS: 我觉得这个页面令人困惑:http://loopback.io/doc/en/lb2/Using-current-context.html

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

给出不起作用的例子有什么意义?我们应该简单地忽略整个页面吗?如果是这样,上下文呢? :)

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

【问题讨论】:

    标签: loopbackjs


    【解决方案1】:

    您可以使用远程挂钩访问 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()
     }) 
    
    }
    

    【讨论】:

    • 我知道,但是,正如我所说,我想从模型的内置 CRUD 方法(确切地说是它们的覆盖版本)中访问它。我从远程钩子甚至远程方法本身访问上下文都没有问题。
    【解决方案2】:

    当然,您可以使用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 调用远程,并传递预期的 header

     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

    【讨论】:

    • 我不认为 ctx 被传递给内置的 CRUD 方法,这就是整个问题。你能举个例子吗?
    • ctx 本身没有通过,但是ctx.args 是通过了。 ctx.args 正是传递给您的 CRUD 方法的数据。
    • 假设你的遥控器接受object类型的参数filter,那么ctx.args将包含一个属性filter
    • 你举个例子好吗?
    • 我提供了内置和远程的完整示例。
    猜你喜欢
    • 2014-09-19
    • 2022-01-11
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多