【问题标题】:Is it necessary to set a Content-Type in Node.js?是否需要在 Node.js 中设置 Content-Type?
【发布时间】: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 文档到处引用 隐式标头模式,但没有文档告诉开发人员它为应用程序开发人员做了什么。

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


【解决方案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

        【讨论】:

          猜你喜欢
          • 2013-12-21
          • 2017-11-13
          • 2012-03-15
          • 1970-01-01
          • 2011-05-04
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          相关资源
          最近更新 更多