是否需要在 Node.js 中设置 Content-Type?
Posted
技术标签:
【中文标题】是否需要在 Node.js 中设置 Content-Type?【英文标题】:Is it necessary to set a Content-Type in Node.js? 【发布时间】:2014-04-15 21:52:24 【问题描述】:刚开始玩 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();
我阅读了docs for .write(),它说如果没有指定标头“它将切换到隐式标头模式并刷新隐式标头”
通过一些测试,我发现我可以像这样写一行:
res.end(html); // or
res.end(img);
这些都可以正常工作。我还用我的本地 Apache 服务器进行了测试,当我查看加载图像时设置的标头时,那里没有设置 Content-Type
标头。
我需要费心设置它们吗?如果我不这样做可能会出现什么情况或错误?
【问题讨论】:
很好的问题。 node.js 文档到处引用 隐式标头模式,但没有文档告诉开发人员它为应用程序开发人员做了什么。 【参考方案1】:Content-Type
标头在技术上是可选的,但随后您将其留给浏览器来猜测您要返回的内容类型。通常,如果您知道类型(您可能知道),则应始终指定 Content-Type
。
【讨论】:
【参考方案2】:隐式标头模式意味着使用 res.setHeader() 而不是节点为您找出 Content-Type 标头。使用 res.end(html) 或 res.end(img) 不会返回任何 Content-Type,我使用在线 http 分析器进行了检查。相反,它们之所以有效,是因为您的浏览器会发现它。
【讨论】:
NodeJs 没有为你设置Content-Type
。如果不显式设置,就不会有这样的标题。【参考方案3】:
如果您在节点应用程序中使用 Express,则 response.send(v)
将根据 v
的运行时类型隐式选择默认内容类型。更具体地说,express.Response.send(v)
的行为如下:
v
是一个字符串(并且尚未设置任何内容类型),则发送Content-Type: text/html
如果v
是一个缓冲区(并且尚未设置任何内容类型),则发送Content-Type: application/content-stream
如果v
是任何其他bool/number/object
(并且尚未设置内容类型),则发送Content-Type: application/json
这里是来自 Express 的相关源代码:https://github.com/expressjs/express/blob/e1b45ebd050b6f06aa38cda5aaf0c21708b0c71e/lib/response.js#L141
【讨论】:
【参考方案4】:当然不是,如果你在玩 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`);
);
【讨论】:
【参考方案5】:这个答案需要完善
当前安全策略将添加一个标头X-Content-Type-Options: nosniff
来自 MDN -- 站点安全测试人员通常希望设置此标头。
示例 :: 如果设置了此标头并且您正在打开一个没有 Content-Type 为 text\html
的 HTML 页面,该页面将显示为纯文本(而不是已解析的 HTML)
所以是的 - 应该为每种类型设置 Content-Type
【讨论】:
以上是关于是否需要在 Node.js 中设置 Content-Type?的主要内容,如果未能解决你的问题,请参考以下文章