回送3并挂钩REST API标头

问题描述

我有一个旧版应用程序,该应用程序使用环回3并公开了REST API,我想从客户端的传入请求中获取JWT令牌。我写了一个用于访问 req 对象以访问令牌的钩子。

Object.keys(app.dataSources).forEach((name: string) => {
    if (camelCase(name) === name) {
        app.dataSources[name].connector.observe('before execute',(ctx,next) => {
            if (!ctx.req.uri) return next(); 
            Object.keys(ctx.req).forEach(function(key) {
                console.log(key,ctx.req[key]);
            }); 
        });
    }
});

路线定义

accepts: [
    {arg: 'codeValue',type: 'string',required: false,http: {source: 'query'}},{arg: 'codeId',http: {source: 'query'}}
]

上述挂钩执行时的输出

method GET
uri http://localhost:8010/api/v1/code/100
qs { codeValue: '' } <<== Issue 1
json true
form undefined
headers undefined  <<== Issue 2
timeout undefined

以下是上面突出显示的问题:

  • 即使我指定了查询参数 codeId ,它也没有映射到 req 对象
  • 要求中的标题未定义

卷曲命令

curl -H "codeId: TS01" -H "codeValue: 'TS 01" http://localhost:8081/api/v1/code/100

我们计划转移回版本4,但这是一个长期过程。任何指针都将受到高度赞赏。

解决方法

LoopBack团队您好ello

基于代码中的以下代码段,我假设您正在使用loopback-connector-rest(或类似的连接器)来调用另一个后端服务的API。

app.dataSources[name].connector.observe('before execute'

请注意,您的模型方法发出的传出请求会调用before execute钩子。

要访问传入请求对象,您需要创建一个远程挂钩(请参阅文档中的Remote hooks)。

app.remotes().before('**',(ctx,next) => {
  if (!ctx.req.url) return next(); 
  Object.keys(ctx.req).forEach(function(key) {
    console.log(key,ctx.req[key]);
  }); 
});

(请注意,传入请求不具有req.uri属性,应改用req.url。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...