Just started playing with Node.js and after seeing a few examples I see that usually the Content-Type
is set before returning some content.
Usually somethin
Of course not, if you are playing with NodeJs. But to make a maintainable code with different modules, large and API pages you should have 'Content-Type' in your server definition.
const http = require('http');
const host_name = 'localhost';
const port_number = '3000';
const server = http.createServer((erq, res) => {
res.statusCode = 200;
// res.setHeader('Content-Type', 'text/html');
res.end("<h1> Head Line </h1> <br> Line 2 <br> Line 3");
});
server.listen(port_number, host_name, ()=> {
console.log(`Listening to http://${host_name}:${port_number}`);
});
The Content-Type
header is technically optional, but then you are leaving it up to the browser to essentially guess what type of content you are returning. Generally you should always specify a Content-Type
if you know the type (which you probably do).
If you're using Express within your node app, then response.send(v)
will implicitly pick a default content-type depending on the runtime type of v
. More specifically, the behavior of express.Response.send(v)
is as follows:
v
is a string (and no content-type has already been set) then send Content-Type: text/html
v
is a Buffer (and no content-type has already been set) then send Content-Type: application/content-stream
v
is any other bool/number/object
(and no content-type has already been set) then send Content-Type: application/json
Here's the relevant source code from Express: https://github.com/expressjs/express/blob/e1b45ebd050b6f06aa38cda5aaf0c21708b0c71e/lib/response.js#L141
Implicit headers mode means using res.setHeader() rather than node figuring out the Content-Type header for you. Using res.end(html) or res.end(img) does not serve back any Content-Type, I checked with an online http analyser. Rather they work because your browser figures it out.