包含 API 请求的 NodeJS 路由错误



我正在编写一个路由,用于检查系统应用程序是否在线,然后以简单的 200 状态 OK 或 404 状态响应客户端。

我正在使用快递和请求进行 api 调用。

路由如下所示:

app.get('/status/keymgr', async (req, res, next) => {
try{
var endpoint = `http://${config.KeyManager.host}:${config.KeyManager.adminPort}/healthcheck`;
console.log(endpoint);
await request.get(endpoint, function(err, response, body){
if (!err && response.statusCode == 200){
res.send('OK');
}else{
res.status(404);
}
}).end();
}catch(error){
res.status(404);
}finally{
next();
}
});

由于某种原因,我收到以下错误:

未捕获异常:发送标头后无法设置标头。

我猜在路由运行res.send()res.status()之前,某种响应正在发送到浏览器。

我不知道这里出了什么问题。知道吗??

正如@ndugger提到的,您收到此异常的原因是因为request.get不返回promise,因此await这里没有用。您有两种选择,要么使用util.promisify,要么将请求包装在新的承诺下,并在回调完成后解决。像这样的东西

app.get('/status/keymgr', async (req, res, next) => {
var endpoint = `http://${config.KeyManager.host}:${config.KeyManager.adminPort}/healthcheck`;
console.log(endpoint);
try {
await new Promise((resolve, reject) => {
request.get(endpoint, function (err, response, body) {
if (!err && response.statusCode == 200) {
// res.send('OK');
resolve('OK');
} else {
reject('404')
// res.status(404);
}
});
});
res.send('OK');
} catch (err) {
res.status(404);
} finally {
next();
}
}

最新更新