Hello World
Hello World

Reputation: 57

Using res.write before res.send results in error

I'm trying to understand why the following code throws an error.

app.get("/", (req, res) => {
    res.write("Hello");
    res.send(" World!");
})
// Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

app.get("/", (req, res) => {
    res.write("Hello");
    res.write(" World!");
    res.end();
})
// Works fine

I don't see how headers are set after res.send since res.send is the one who sets the headers.

I read online that res.send is the equivalent of res.write + res.end, but this shows it is not entirely true.

I would like to be able to write base data to the response and then use res.send for it's useful task like automatically setting the Content-Type header based on the data sent.

app.use((req, res, next) => {
    res.write("Base data");
    next();
})

app.get("/", (req, res) => {
    res.send("Route specific data");
})
// Result: Base data + Route specific data

Is there something other than res.write which lets me write data to the response but doesn't conflict with res.send ?

Upvotes: 1

Views: 577

Answers (1)

Heiko Theißen
Heiko Theißen

Reputation: 16892

res.write starts writing the body, but before it can do so, it must write all headers, and you cannot write any additional headers afterwards. But res.send writes an additional Content-Type header, based on whether its argument is a Javascript object or a a string. Therefore you cannot use res.send after res.write.

res.send is meant to be used on its own, like res.json or res.render.

Upvotes: 2

Related Questions