是否需要在 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?的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中设置计时器

从 Node.js 中设置全局环境变量

如何在 Dockerfile 中设置 Node 环境变量以运行 node.js 应用程序?

在 WebStorm 中设置 Node.js 环境变量

如何在 Node.js 中设置 dotenv 文件?

如何在 node.js 中设置默认时区?