我有一个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]:发送标头后无法设置标头 给客户
答案 0 :(得分:1)
为什么会发生?
1st
事件发生,您在timeout
毫秒内设置了6000
来调用回调函数。2nd
事件在6000
之前发生,并且由于事件2
而执行回调。回复发送到这里。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);
}
}
);
};