Difference between response.send and response.write in node js

user3275959 picture user3275959 · Feb 13, 2014 · Viewed 99.5k times · Source

I have written a small API which uses the Node js "restify" framework. This API receives a request (actually anything after "/") and then send that request to another server. Get the response back from server and passes the response back to original source of request. For this API I am using both restify server and client.

Below is that API code for better understanding.

var apiServer = require('apiServer');
apiServer.start();

var restify = require('restify');
var assert = require('assert');

function onRequest(request, response, next)
{
    var client = restify.createStringClient({ 
        url: 'http://example.com'
    });

    client.get('/' + request.params[0], function(err, req, res, data) {
        assert.ifError(err);

        response.setHeader('Content-Type', 'text/html');
        response.writeHead(res.statusCode);
        response.write(data);
        response.end();
    });
    next();
}

function start()
{
    var server = restify.createServer();
    server.get(/^\/(.*)/, onRequest);
    server.listen(8888);

    console.log("Server has started.");
}

exports.start = start;

Now I need to know the difference between response.write and response.send of Node.js. Because with response.write I can set header and write in it but it is not possible to do anything with headers when I use response.send. When I use response.send with setHeader() or writeHeader() I get this error:

http.js:691
    throw new Error('Can\'t set headers after they are sent.');
          ^
    Error: Can't set headers after they are sent.

There is also another thing. With response.send() I get the complete HTML output on the screen like:

<!DOCTYPE html>\n<html>\n\t<head></head></html> ..... "bla bla bla"

But with response.write I do not get the html on screen but only the text "bla bla bla".

It would be great if someone can explain me the differences.

Answer

Flying Fisher picture Flying Fisher · Feb 13, 2014

response.send(msg) is equal to response.write(msg);response.end();

Which means, send can only be called once, write can be called many times, but you must call end yourself.