代码之家  ›  专栏  ›  技术社区  ›  Rob

是否需要在Node.js中设置内容类型?

  •  6
  • Rob  · 技术社区  · 10 年前

    刚开始使用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服务器进行了测试,当我查看加载图像时设置的标头时 内容类型 标题设置在那里。

    我需要麻烦设置它们吗?如果我不这样做,可能会出现什么情况或错误?

    5 回复  |  直到 10 年前
        1
  •  6
  •   loganfsmyth    10 年前

    这个 Content-Type header在技术上是可选的,但实际上是由浏览器决定的 猜测 返回的内容类型。通常,应始终指定 内容类型 如果你知道类型(你可能知道)。

        2
  •  3
  •   Lucian Wischik    5 年前

    如果您在节点应用程序中使用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
  •   John Middlemas    6 年前

    隐式头模式意味着使用res.setHeader(),而不是节点为您计算Content-Type头。使用res.end(html)或res.end。相反,它们之所以有效,是因为您的浏览器能够解决问题。

        4
  •  0
  •   Aritra Ghosh    4 年前

    当然不是 ,如果您正在玩NodeJ。但要使用不同的模块、大型页面和API页面生成可维护的代码,您应该在服务器定义中使用“内容类型”。

    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
  •  0
  •   user1428716    3 年前

    这个答案需要改进

    • 当前安全策略将添加标题 X-Content-Type-Options: nosniff
    • 来自MDN——站点安全测试人员通常希望设置此标头。

    示例::如果设置了此标题,并且您正在打开一个没有内容类型的HTML页面 text\html 页面将显示为纯文本(而不是解析的HTML)

    所以是-应在每种类型上设置内容类型