我有一个现有的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检查头,并进行两个微服务调用并将它们连接在一起。
这可能吗?
1条答案
按热度按时间cu6pst1q1#
但我觉得这是一种有点混乱的API版本控制方法。
我不认为这是一种糟糕的API版本控制方法,因为这是一种常见的方法。此外,您可以在新的子目录中提供新服务(例如yourwebsite.com/yourservice.../v2/yourFunction).
更好的是,如果我可以让nginx来处理这个版本。
我也不同意让NginX做你的Web服务的“逻辑”会更好,因为NginX的责任是为你的网站/Web服务提供服务,而不是实现逻辑。
但是,如果你仍然想使用NginX合并请求,你可能想看看this question/answer。这个答案使用openresty。您可能需要先install this。
如上所述,您可以使用以下代码调用多个(在您的案例中为2)服务:
字符串
如果你只想在特定的头出现时执行上面提到的代码,你可以使用
if
语句,就像this answer中描述的那样。因此,您的if
语句看起来像这样:型