gpt4 book ai didi

node.js - 为什么我的 Express 路由器仅在发送 JSON 时崩溃,而不是在发送文本时崩溃?

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:59 25 4
gpt4 key购买 nike

statusRouter.route('/')
.all(function(req,res,next){
res.writeHead(200, {'Content-Type': 'application/json'});
next();
})
.get(function(req, res, next) {
res.json({
name : "xyz"
});
});

这会崩溃 - 发送后无法设置 header 。
但问题是,这有效:

statusRouter.route('/')
.all(function(req,res,next){
res.writeHead(200, {'Content-Type': 'text/plain'});
next();
})
.get(function(req, res, next) {
res.end("xyz");
});

注意:如果我在第一种发送 JSON 的情况下删除 writeHead 函数,它也会开始工作。为什么当我对其进行 writeHead 时它不起作用?这件事让我发疯,谁能解释为什么会发生这种情况?
P.S 我正在使用我自己的路由器快速生成的应用程序。

最佳答案

res.writeHead()res.end() 都不是由 Express 实现的,而是由 Node.js 实现的 http模块。

其文档指出,res.end() :

If data is specified, it is equivalent to calling response.write(data, encoding) followed by response.end(callback)

所以 res.end("xyz") 是缩写:

res.write("xyz");
res.end();

对于res.write()文档指出:

If this method is called and response.writeHead() has not been called, it will switch to implicit header mode and flush the implicit headers.

所以 res.end("xyz") 实际上是:

if (! res.headersSent) {
res.writeHead(...);
}
res.write("xyz");
res.end();

这意味着在使用 res.end() 之前,在您自己的代码中发出 res.writeHead() 是完全可以的。在内部,http 模块会知道您已经刷新了 header ,因此它不会再次执行此操作(从而防止出现错误)。但是,一旦调用 writeHead(),您就无法设置不同的 header 或更改现有 header 。

现在,res.json() 是另一回事了:这不是 http 模块的一部分,而是 Express 本身的一部分。因为它用于发送 JSON 响应,所以它将内容类型 header 设置为 application/json (因此您不必这样做)。

但这仅在 header 尚未发送时才有效:当 header 已经发送出去时,您无法设置 header 。这就是您收到错误的原因。

如果您想在 Express 中设置特定 header ,请使用 res.set() .

关于node.js - 为什么我的 Express 路由器仅在发送 JSON 时崩溃,而不是在发送文本时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com