2015-06-19 2 views
0

Используя сервер Node.js Express, мы получаем ошибки «не могут отправляться заголовки дважды ..», если мы попытаемся отправить два ответа на один и тот же запрос. Я хочу найти лучший способ предотвратить отправку двух ответов для этого конкретного случая, но также и для других.Экспресс - предотвращение отправки двух + ответов

У меня есть простой/тестовый маршрут, который возвращает информацию о состоянии сервера, он выглядит следующим образом:

app.get('/test', function (req, res, next) { 

    var client = redis.createClient(); 

    var response = {}; 

    var alreadySentResponse = false; //I use a boolean to check if I already sent a response 

    client.on("error", function (err) { //this callback will invoke res.send 
     log.error('error in redis client test error callback:', err); 
     if(alreadySentResponse === false){ 
      alreadySentResponse = true; 
      res.status(500).send({"test message from SmartConnect": err}); 
     } 

    }); 

    client.info(function (err, resp) { //this callback will also invoke res.send 
     response['redisInfo'] = resp; 
     if(alreadySentResponse ===false){ 
      alreadySentResponse = true; 
      res.status(200).send({"test message from SmartConnect": response}); 
     } 
    }); 
}); 

есть лучший способ сделать это? Может ли объект res отслеживать, был ли он уже отправлен? Кажется, что он сбой сервера, если res.send дважды вызывается и т. Д. Другая проблема, конечно, в том, что, если есть внутренняя ошибка с клиентом, если сообщение об успешности отправляется, это не значит, что я не хочу также отправить client.on («ошибка») сообщение на вершине, что ...

+0

PS, у меня аналогичная проблема дизайна с использованием асинхронная библиотека. Если обратный вызов вызывается дважды, асинхронная библиотека также вызывает ошибки. –

ответ

3

Вы можете проверить res.headersSent

if (res.headersSent) return; 
client.info(function (err, resp) { //this callback will also invoke res.send 
    if (res.headersSent) return; 
    response['redisInfo'] = resp; 
    res.status(200).send({"test message from SmartConnect": response}); 
}); 
+0

cool, upvoted - хотя это очень хорошо может работать для объектов ответа, в других ситуациях, когда мы хотим предотвратить запуск двух обратных вызовов, это решение не будет работать для этого. –

Смежные вопросы