刚开始玩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
标题。
我需要打扰它们吗?如果我不这样做会出现什么情况或错误?
答案 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}`);
});