2016-09-22 9 views
0

私のノードサーバーへのhttp要求を実行するボタンを押したユーザーを含むWebサイトを作成しています。そこから、私のノードサーバーは "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) 

My機能

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'は非同期であるためです。 write-callback関数の中でクライアントを破棄してみてください。 –

答えて

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

助けてくれてありがとう! –

関連する問題