我有一个现有的快速端点,如下所示:
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检查标头,并进行两个微服务调用并将它们连接在一起。
这可能吗?
答案 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;
}