Node.js Express API: как обрабатывать несколько обратных вызовов - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть конечная точка API, которая выполняет функцию, которая, в свою очередь, прослушивает некоторые события через веб-сокет и затем возвращает ответ через обратный вызов конечной точке API, поэтому конечная точка может ответить этим объектом назапрос http.

Иногда я получаю только одно событие, иногда я получаю два события от слушателя.Когда появляется только первое событие, у меня нет проблем.Поскольку второе событие имеет приоритет, я использую setTimeout для его ожидания, если оно все еще появляется.

Проблема заключается в том, что при появлении второго события моя конечная точка API отвечает своим объектом, но потомэто падает.Я полагаю, это как-то связано со вторым обратным вызовом, и я не знаю, как с этим справиться.Вот как структурирован код:

app.get('/api/myendpoint', function(req, res) {

    myVar_1 = req.query.myvar1;
    myVar_2 = req.query.myvar2;

    myFunction(myVar_1, myVar_2, function(data, error) {
        if (!error) res.json(data);
        else res.json({"error": String(error)});        
    });

});


function myFunction(myVar_1, myVar_2, callback){

    listenOnSocket.someEvent(myVar_1,
        function(error, event) {
            if (error) callback(null, error);
            else setTimeout(function() {callback(event, null);}, 6000);
        }
    );    

    listenOnSocket.someEvent(myVar_2,
        function(error, event) {
            if (!error) callback(event, null); 
            else callback(null, error);
        }
    );

};

Вот как выглядят мои ошибки:

Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту

1 Ответ

0 голосов
/ 22 сентября 2018

Почему это происходит?

  1. 1st Событие, при котором вы устанавливаете timeout на 6000 мс для вызова функции обратного вызова.
  2. 2nd событие происходит до 6000, и обратный вызов выполняется из-за события 2.Здесь отправляется ответ.
  3. timeout завершается, и ожидающая функция, переданная в setTimeout, выполняет обратный вызов, который снова отправит ответ, и после отправки отправлять заголовки в ответ невозможно.

Решение

Основным решением будет проверка переменной флага в функции, переданной для установки времени ожидания, независимо от того, произошло событие 2nd или нет.

function myFunction(myVar_1, myVar_2, callback){

    let executed = false;
    listenOnSocket.someEvent(myVar_1,
        function(error, event) {
            if(!executed){
            executed = true
            if (error) callback(null, error);
            else setTimeout(function() {
                       callback(event, null);
                    }, 6000);
        }
       }
    );    

    listenOnSocket.someEvent(myVar_2,
        function(error, event) {
            if(!executed){
            executed = true;
            if (!error) callback(event, null); 
            else callback(null, error);
        }
       }
    );

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...