Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js' writeable stream and the drain event

The documentation for write() says:

Returns false to indicate that the kernel buffer is full, and the data will be sent out in the future.

and the documentation for the drain event says:

After a write() method returned false, this event is emitted to indicate that it is safe to write again.

What does that mean? Do I have to wait for the drain event before I can write again? What happened to the data which I tried to write? Is that lost? What happens when I call write without waiting for the drain event?

like image 259
Aaron Digulla Avatar asked Apr 07 '12 18:04

Aaron Digulla


People also ask

Which of the following statements about writable streams in Nodejs is true?

Q 5 - Which of the following is true about writable stream? A - writable stream is used for write operation.

What is the correct way to pipe a readable stream and a writable stream?

To consume a readable stream, we can use the pipe / unpipe methods, or the read / unshift / resume methods. To consume a writable stream, we can make it the destination of pipe / unpipe , or just write to it with the write method and call the end method when we're done.

What is drain event?

The drain event is for when a writable stream's internal buffer has been emptied.

How do I fix a process out of memory exception in node JS?

This exception can be solved by increasing the default memory allocated to our program to the required memory by using the following command. Parameters: SPACE_REQD: Pass the increased memory space (in Megabytes).


2 Answers

@TooTallNate answer is wrong. You should absolutely care about .write return value.

What does that mean? Do I have to wait for the drain event before I can write again?

Yes, when .write returns false, you must wait.

What happened to the data which I tried to write? Is that lost?

No, it is not lost, it's buffered in the correct order.

What happens when I call write without waiting for the drain event?

If you don't handle the drain event correctly, your script will block the event loop, and eventually exhaust the memory limit crashing your application.

I give a detail explanation in this other question: why does attempting to write large a large file cause js heap to run out of memory

like image 123
Marcos Casagrande Avatar answered Sep 26 '22 21:09

Marcos Casagrande


You can call write() without caring about the return value safely. Node will buffer any write calls while the kernel buffer is full, and push them in order as you would expect. You do not need to wait for the 'drain' event before writing again.

Optionally, you can check the return value of write() and then notify the thing that is writing to the Stream that the buffer is full. This is exactly what Stream#pipe() does.

So usually, just use Stream#pipe() and all the goodies are taken care of for you :)

like image 24
TooTallNate Avatar answered Sep 23 '22 21:09

TooTallNate