gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:26:36 25 4
gpt4 key购买 nike

我有一个现有的 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 header ,那么它也会从不同的服务获取一些数据,并将其添加到. (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 检查 header ,进行微服务调用并将它们连接在一起。

这可能吗?

最佳答案

“但这让我觉得执行 API 版本控制有点困惑。”我不认为这是执行 API 版本控制的坏方法,因为这是执行此操作的常用方法。此外,您可以在新的子目录(例如 yourwebsite.com/yourservice.../v2/yourFunction)中提供新服务。

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

但是,如果您仍想使用 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)
}
}

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

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

关于json - 是否可以使用 nginx 合并两个 json 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55930850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com