Обратный цикл 3 и привязка к заголовкам REST API

#javascript #node.js #rest #loopbackjs #loopback4

#javascript #node.js #rest #loopbackjs #обратный цикл 4

Вопрос:

У меня есть устаревшее приложение, которое использует loopback 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', type: 'string', required: false, 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

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

У нас есть планы перейти на loopback к версии 4, но это долгосрочный процесс. Любые указания высоко ценятся.

Ответ №1:

Привет от команды LoopBack 👋

Основываясь на следующем фрагменте вашего кода, я предполагаю, что вы используете loopback-connector-rest (или аналогичный соединитель) для вызова API другого серверного сервиса.

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

Пожалуйста, обратите внимание, что before execute перехват вызывается для исходящих запросов, выполняемых методами вашей модели.

Чтобы получить доступ к объекту входящего запроса, вам нужно вместо этого создать удаленный перехват (см. Удаленные перехваты в наших документах).

 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 вместо этого.)

Комментарии:

1. Привет, Мирослав. Большое вам спасибо, и это решило давнюю проблему.