1. ホーム
  2. javascript

[解決済み] node.jsのWebサーバでWrite After Endエラーが発生する。

2022-02-26 12:27:50

質問内容

node.jsの趣味のプロジェクトで、"write after end" Errorに悩まされ、困っています。 node.jsのWebサーバを作成し、HTMLページから受け取ったコマンドを次のコードで別のプロセスに送信しています。

var netSocket = require('net').Socket();
netSocket.connect(9090);
netSocket.write(messages);
netSocket.end();

これは、トラフィックが増加し始める(つまり、送信されるメッセージの量やメッセージのサイズが増加する)までは機能します。 この時点で、次のようなエラーが発生しました。

Error: write after end
    at writeAfterEnd (_stream_writable.js:132:12)
    at Socket.Writable.write (_stream_writable.js:180:5)
    at Socket.write (net.js:615:40)
    at Socket.<anonymous> (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/speech_module/web_server_HTTPS.js:66:15)
    at Socket.emit (events.js:95:17)
    at Socket.onevent (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:327:8)
    at Socket.onpacket (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:287:12)
    at Client.ondecoded (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/client.js:193:14)
    at Decoder.Emitter.emit (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20)

私の推測では、9090のサーバーがトラフィック量に圧倒され、エラーが発生したのだと思います。 node.jsの世界では全くの初心者なので、この問題を解決するためのヒントがあれば、本当にありがたいのですが。

また、ウェブサーバーはSSLでページを提供していることに注意してください(それが何らかの違いを生むかもしれないので)。

お忙しい中、お読みいただきありがとうございました。

マーク

解決方法は?

NodeJSはノンブロッキングの非同期プラットフォームです。

あなたの場合

netSocket.write(messages);

は非同期メソッドであるため netSocket.end() が呼び出される前に write が完了する。

というのが正しい使い方でしょう。

netSocket.write(messages, function(err) { netSocket.end(); });

ここでの第二引数はコールバック関数で、'write'メソッドがその仕事を終えると呼び出されるものです。

NodeJS、非同期スタイル、コールバックについてもっと読む/見ることをお勧めします。

ここからが本題です。 https://www.youtube.com/watch?v=GJmFG4ffJZU

そしてもちろん、NodeJSの APIドキュメント ネットソケットについて。