Reputation: 57
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
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