在Node.js中是否有必要设置Content-Type?

6

我刚开始接触Node.js,看了一些例子后发现通常在返回内容之前都会设置Content-Type

对于HTML通常是这样的:

res.writeHead(200, {'Content-Type': 'text/html'});
res.write(html);
res.end();

关于图片:

res.writeHead(200, {'Content-Type': 'image/png'});
res.write(img, 'binary');
res.end();

我阅读了 .write() 的文档,文档中表示如果没有指定头部信息,则会切换到隐式头部模式并刷新隐式头部。

经过一些测试,我发现可以只写一行代码:

res.end(html); // or
res.end(img);

这两个都很好用。我还在本地Apache服务器上进行了测试,当我查看加载图像时设置的标头时,那里没有设置任何Content-Type 标头。
我需要设置它们吗?如果我不这样做,会出现哪些情况或错误?

1
很好的问题。Node.js文档中有时提到隐式头模式,但没有文档告诉开发人员它对应用程序开发者做了什么。 - rmoestl
5个回答

6

Content-Type头部在技术上可选,但如果省略了它,就相当于让浏览器去“猜测”返回的内容类型。通常情况下,如果您知道内容类型(您很可能知道),则应始终指定Content-Type


3
如果你正在使用Express框架开发node应用,那么response.send(v)将会根据v的类型自动选择默认的内容类型。更具体地说,express.Response.send(v)的行为如下:
  • 如果v是字符串(且没有设置过内容类型),则发送Content-Type: text/html
  • 如果v是Buffer(且没有设置过内容类型),则发送Content-Type: application/content-stream
  • 如果v是其他任何布尔值/数字/对象(且没有设置过内容类型),则发送Content-Type: application/json
以下是Express的相关源代码:https://github.com/expressjs/express/blob/e1b45ebd050b6f06aa38cda5aaf0c21708b0c71e/lib/response.js#L141

0

隐式头模式意味着使用res.setHeader()而不是Node为您计算Content-Type头。使用res.end(html)或res.end(img)不会返回任何Content-Type,我使用在线http分析器进行了检查。相反,它们之所以起作用是因为您的浏览器自己计算出来。


NodeJs不会为您设置Content-Type。如果您没有显式设置它,就不会有这样的标头。 - Dmitry

0

这个答案需要完善

  • 当前的安全策略将添加一个头部 X-Content-Type-Options: nosniff
  • 来自 MDN -- 网站安全测试人员通常希望设置此头部。

例如:如果设置了此头部并且您正在打开一个没有 Content-Type 为 text\html 的 HTML 页面,则该页面将显示为纯文本(而不是解析后的 HTML)

因此,是的 - 每种类型都应该设置 Content-Type


0
当然不需要,如果你正在使用NodeJS。但是为了创建具有不同模块、大量API页面和可维护代码,你应该在服务器定义中包含“Content-Type”。
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}`);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接