2016-09-22 30 views
0

我正在創建一個網站,涉及用戶按下一個按鈕,它執行一個http請求到我的節點服務器。從那裏,我的節點服務器使用「net.Socket()」打開一個TCP套接字。之後,我使用res.send(「ok」)成功發送郵件後發送回覆。當用戶多次按下它時,我會看到下面的錯誤。另外,當我與TCP通信的服務器不可用時,也會出現同樣的問題。有沒有辦法阻止來自用戶的多個請求,或者當TCP服務器不可用時崩潰我的節點服務器?節點js,來自前端的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

問題可能在這裏:'client.write(JSON.stringify(data)); client.destroy();'因爲'write'是異步的。嘗試銷燬寫入回調函數中的客戶端。 –

回答

0

你的代碼,如果發生錯誤,將調用回調兩次:

client.on('close', function(){ 
    cb(null, message); // <-- here 
}); 

client.on('error', function(err) { 
    client.destroy(); 
    cb(err, null);  // <-- and here 
}); 

fine manual狀態,有關error事件:

發生錯誤時發出。在此事件之後將直接調用'close'事件。

因此,closeerror處理程序都被調用,並且都調用回調函數。

您應該檢查傳遞給close處理程序的參數,如果發生錯誤,它將爲true。在這種情況下,請不要撥打回撥號碼:

client.on('close', function(hadError) { 
    if (! hadError) cb(null, message); 
}); 
+0

感謝您的幫助! –