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

时间:2014-03-12 01:14:35

标签: javascript node.js http-headers content-type

刚开始玩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标题。

我需要打扰它们吗?如果我不这样做会出现什么情况或错误?

4 个答案:

答案 0 :(得分:4)

Content-Type标题在技术上是可选的,但是您将它留给浏览器基本上猜测您要返回的内容类型。通常,如果您知道类型(您可能会这样做),则应始终指定Content-Type

答案 1 :(得分:0)

隐式头模式意味着使用res.setHeader()而不是节点为您确定Content-Type头。我使用在线http分析器检查过,使用res.end(html)或res.end(img)不会提供任何Content-Type。它们之所以起作用,是因为您的浏览器知道了。

答案 2 :(得分:0)

如果您在节点应用程序中使用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

答案 3 :(得分:0)

当然不是,如果您正在使用NodeJ。但是,要使用不同的模块,大型页面和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}`);
});