What is the difference between res.send and res.write in express?

node.jsExpressNpm

node.js Problem Overview


I am a beginner to express.js and I am trying to understand the difference between res.send and res.write ?

node.js Solutions


Solution 1 - node.js

res.send

  • res.send is only in Express.js.
  • Performs many useful tasks for simple non-streaming responses.
  • Ability to automatically assigns the Content-Length HTTP response header field.
  • Ability to provides automatic HEAD & HTTP cache freshness support.
  • Practical explanation
    • res.send can only be called once, since it is equivalent to res.write + res.end()
    • Example:
      app.get('/user/:id', function (req, res) {
          res.send('OK');
      });
      

For more details:


res.write

  • Can be called multiple times to provide successive parts of the body.
  • Example:
    response.write('<html>');
    response.write('<body>');
    response.write('<h1>Hello, World!</h1>');
    response.write('</body>');
    response.write('</html>');
    response.end();
    

For more details:

Solution 2 - node.js

res.send is equivalent to res.write + res.end So the key difference is res.send can be called only once where as res.write can be called multiple times followed by a res.end.

But apart from that res.send is part of Express. It can automatically detect the length of response header. But there may be be a chance of memory spike with res.send(), in case of large files, our application hangs in between .

Solution 3 - node.js

One of the most important differences not indicated in any of the answers are "draining".

The res.write may return true or false. As of the documentation:

> Returns true if the entire data was flushed successfully to the kernel > buffer. Returns false if all or part of the data was queued in user > memory. 'drain' will be emitted when the buffer is free again.

So, when doing res.write, the caller should hold off writing until the drain event emits if the res.write returned false.

All these are handled automatically in res.send. The trade off is the buffering you will have to do when using the latter.

Solution 4 - node.js

Suppose you have two line that needs to be shown up and you use res.send as

res.send("shows only First Line")
res.send("won't show second Line")

Then only first line will show up, whereas using res.write you have flexibility to write multiple line such as

res.write("Shows first line")
res.write("Shows second line")
res.send()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionP GView Question on Stackoverflow
Solution 1 - node.jsOmal PereraView Answer on Stackoverflow
Solution 2 - node.jsKeertiView Answer on Stackoverflow
Solution 3 - node.jsCharlieView Answer on Stackoverflow
Solution 4 - node.jsEnthuTechyView Answer on Stackoverflow