我正在创建一个网站,其中涉及用户按下按钮,该按钮向我的节点服务器执行http请求。从那里,我的节点服务器使用" net.Socket()"打开TCP套接字。然后,我使用res.send(" ok")成功传递消息后发送响应。当用户多次按下它时,我会收到以下错误。此外,当我与TCP通信的服务器不可用时,也会出现同样的问题。有没有办法可以阻止来自用户的多个请求,或者当TCP服务器不可用时崩溃我的节点服务器?
Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header (/Users/kevin/Documents/mic/node_modules/express/lib/response.js:719:10)
at ServerResponse.send (/Users/kevin/Documents/mic/node_modules/express/lib/response.js:164:12)
at ServerResponse.json (/Users/kevin/Documents/mic/node_modules/express/lib/response.js:250:15)
at ServerResponse.send (/Users/kevin/Documents/mic/node_modules/express/lib/response.js:152:21)
at /Users/*****/Documents/***/routes/***.js:275:15
at Socket.<anonymous> (/Users/*****/Documents/***/routes/***.js:829:5)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at TCP._handle.close [as _onclose] (net.js:492:12)
我的功能
tcp_client_send('***.***.*.***', 3000, server, function(err, data){
if(err){
logger.log('error', err);
return next("err_msg");
}
else{
logger.log('info', 'Successfully sent message.');
res.send("ok);
}
});
//TCP Client send
function tcp_client_send(ip, port, data, cb) {
var client = new net.Socket();
var message;
client.connect(port, ip, function() {
client.write(JSON.stringify(data));
client.destroy();
});
client.on('data', function(data){
message = data.toString();
});
client.on('close', function(){
cb(null, message);
});
client.on('error', function(err) {
client.destroy();
cb(err, null);
});
}
答案 0 :(得分:0)
如果发生错误,您的代码将调用两次回调:
client.on('close', function(){
cb(null, message); // <-- here
});
client.on('error', function(err) {
client.destroy();
cb(err, null); // <-- and here
});
关于error
事件的fine manual州:
发生错误时发出。此事件后将直接调用
'close'
事件。
因此调用close
和error
处理程序,并且都调用回调。
您应该检查传递给close
处理程序的参数,当发生错误时,该处理程序将为true
。在这种情况下,请不要调用回调:
client.on('close', function(hadError) {
if (! hadError) cb(null, message);
});