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

bbuxkriu  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(99)

我有一个现有的express端点,看起来像这样:

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检查头,并进行两个微服务调用并将它们连接在一起。
这可能吗?

cu6pst1q

cu6pst1q1#

但我觉得这是一种有点混乱的API版本控制方法。
我不认为这是一种糟糕的API版本控制方法,因为这是一种常见的方法。此外,您可以在新的子目录中提供新服务(例如yourwebsite.com/yourservice.../v2/yourFunction).
更好的是,如果我可以让nginx来处理这个版本。
我也不同意让NginX做你的Web服务的“逻辑”会更好,因为NginX的责任是为你的网站/Web服务提供服务,而不是实现逻辑。
但是,如果你仍然想使用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)
    }
}

字符串
如果你只想在特定的头出现时执行上面提到的代码,你可以使用if语句,就像this answer中描述的那样。因此,您的if语句看起来像这样:

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

相关问题