Можно ли объединить два ответа JSON с помощью nginx? - PullRequest
2 голосов
/ 01 мая 2019

У меня есть существующая конечная точка экспресса, которая выглядит следующим образом:

app.get(`${route}/:id`, async (req, res) => {
    try {
        const id = req.params.id;
        const result = await dbFn(id);
        res.send(result);
    } catch (err) {
        res.status(500).end();
    }
});

И это вернет объект, который выглядит следующим образом:

{
    "id": 123,
    "name": "Foo"
}

Теперь я хочу расширить этот API, чтобы, если у него был заголовок Accept: application/vnd.v2, он также получал некоторые данные из другой службы и добавлял их. ( См. Мой связанный вопрос, где предлагается согласование содержимого ).

есть. ответ будет:

{
    "id": 123,
    "name": "Foo", 
    "extraData": {
        "foo": "bar"
    }
}

Теперь я могу сделать это с помощью экспресс, вот как я это сделал:

  app.get(`${route}/:id`, async (req, res, next) => {
    try {

      const id = req.params.id;
      const jobSeeker = await dbFn(id);
      if (req.accepts("application/vnd.v2")) {
        const response = await axios.get(`${integrationApiPath}/connection/${id}`); 
        const ssiData = response.data; 

        res.send({
          ...jobSeeker, 
          ssiData
        })

      }
      else {
        res.send(jobSeeker);
      }
    } catch (err) {
      res.status(500).end();
    }

  });

Но это показалось мне немного грязным способом создания версий API.

Что было бы гораздо приятнее, если бы я мог вместо этого использовать nginx для управления этими версиями.

Таким образом, мне не нужно изменять мой существующий API, я могу просто создать новый сервис и заставить nginx проверять заголовки, выполнять оба вызова микросервисов и объединять их вместе.

Возможно ли это?

1 Ответ

0 голосов
/ 03 мая 2019

«Но это показалось мне немного грязным способом создания версий API».Я не думаю, что это плохой способ создания версий API, поскольку это обычный способ сделать это.Кроме того, вы можете обслуживать новый сервис в новом подкаталоге (например, yourwebsite.com/yourservice.../v2/yourFunction).

«Что было бы гораздо приятнее, если бы явместо этого может быть nginx, обрабатывающий эту версию. "Я также не буду подтверждать, что было бы лучше позволить nginx выполнять «логику» вашего веб-сервиса, поскольку nginx собирается обслуживать ваш веб-сайт / веб-сервис и реализовать логику.

Однако, если вывсе еще хотите объединить запросы, используя nginx, вы можете посмотреть на этот вопрос / ответ .Этот ответ использует openresty .Возможно, вам придется сначала установить .

Как описано, вы можете вызывать несколько (в вашем случае 2) сервисов, используя этот код:

location /yourServiceV2 {
    content_by_lua_block {
        local respA = ngx.location.capture("/yourService")
        local respB = ngx.location.capture("/theServiceWhichExtendsYourService")

        ngx.say(respA.body .. respB.body)
    }
}

Если вы толькоЕсли вы хотите выполнить упомянутый код при наличии определенного заголовка, вы можете использовать оператор if, как описано в этот ответ .Итак, ваше if утверждение будет выглядеть так:

if ($http_accept == 'application/vnd.v2') {
    return 405;
}
...