具有API请求的NodeJS路由错误

时间:2018-05-10 13:22:23

标签: node.js express

我正在编写一条路线,检查系统应用是否在线,然后以简单的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()之前,某些响应正在发送到浏览器。

我无法弄清楚这里有什么问题。有什么想法??

1 个答案:

答案 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();
  }
}