Node.js Express API:如何处理多个回调

时间:2018-09-22 11:20:49

标签: node.js api express callback http-headers

我有一个API端点,该端点执行一个函数,该函数依次通过Web套接字侦听某些事件,然后通过对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 :(得分:1)

为什么会发生?

  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);
        }
       }
    );

};