Write After End error in node.js webserver

I had similar issue with node module compression, after i update it to the latest version 1.6, the issue was resolved

npm install [email protected]

NodeJS is a non-blocking async platform.

In your case,

netSocket.write(messages);

is an async method; therefore, netSocket.end() is called before write is complete.

The correct use would be:

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

The second argument here is a callback function that will be called once the 'write' method finishes its job.

I would recommend you read/watch more about NodeJS, async styles and callbacks.

Here is a great place to start: https://www.youtube.com/watch?v=GJmFG4ffJZU

And of course, the NodeJS API docs regarding net sockets.


First, I think there is misinformation in another answer about socket.write() and socket.end(). It is perfectly normal and OK to do them back to back in the same tick:

socket.write(everythingIPlanToSend);
socket.end();

You do not need to provide a callback to write. The callback will tell you when the data has been fully flushed out the connection, but that is an optional notification that typical programs don't need to concern themselves with.

However, looking at your stack trace, I think your event handling control flow is broken in this manner. You have a socket.io client connected, and that emits events which you listen for. When those events fire you send them onward to your upstream server. Then you end the upstream socket connection. At that point, you must unbind (removeListener) your socket.io connection listener so that as more events arrive you don't attempt to send them up the connection you have already closed.

Another way to say it is whenever you call .end() on your upstream socket, you have to make sure that future incoming events from the browser do not make use of that same socket. OR you have to change your code to use the same upstream socket for all events from the corresponding browser socket (which is probably more efficient/correct), BUT in that case don't call .end() on it until the browser socket actually disconnects.