我正在编写一条路线,检查系统应用是否在线,然后以简单的200状态ok或404状态响应客户端。
我正在使用express和request来进行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();
}
});
出于某种原因,我收到以下错误:
uncaughtException:发送后无法设置标头。
我猜测在路由运行res.send()
或res.status()
之前,某些响应正在发送到浏览器。
我无法弄清楚这里有什么问题。有什么想法??
答案 0 :(得分:1)
AS @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();
}
}