是否可以使用nginx合并两个json响应?

时间:2019-05-01 02:12:17

标签: json nginx microservices api-design content-negotiation

我有一个现有的快速端点,如下所示:

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标头,那么它还将从其他服务中获取一些数据,并将其添加到该服务中。 (See my related question where using content negotiation is suggested)。

即。响应将是:

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

现在,我可以使用express做到这一点,这是我的做法:

  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 :(得分:0)

“但是它使我感到有点混乱,无法进行API版本控制。” 我认为这不是进行API版本控制的坏方法,因为这是常用的方法。另外,您可以在新的子目录(例如yourwebsite.com/yourservice.../v2/yourFunction)中提供新服务。

“如果我可以让Nginx来处理此版本控制,那就更好了。” 我也不会确认让nginx做您的web服务的“逻辑”会更好,因为nginx即将为您的网站/ webservice提供服务并实现该逻辑。

但是,如果您仍然想使用nginx合并请求,则可能需要看看this question/answer。该答案使用openresty。您可能必须先install this

如前所述,您可以使用以下代码调用多个(在您的情况下为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)
    }
}

如果只想在出现特定标头时执行下面提到的代码,则可以使用this answer中所述的if语句。因此,您的if语句将如下所示:

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