Ошибка маршрута NodeJS с запросом API в нем - PullRequest
0 голосов
/ 10 мая 2018

Я пишу маршрут, который проверяет, подключено ли системное приложение к сети, а затем отвечает клиенту простым ок 200 статусом или статусом 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();
        }
    });

По какой-то причине я получаю следующую ошибку:

uncaughtException: невозможно установить заголовки после их отправки.

Я предполагаю, что какой-то ответ отправляется в браузер до того, как маршрут запускает res.send() или res.status().

Я не могу понять, что здесь не так. Есть идеи ??

1 Ответ

0 голосов
/ 10 мая 2018

Как уже упоминалось @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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...