【问题标题】:Using res.write before res.send results in error在 res.send 之前使用 res.write 会导致错误
【发布时间】:2022-11-02 23:48:25
【问题描述】:

我试图理解为什么以下代码会引发错误。

app.get("/", (req, res) => {
    res.write("Hello");
    res.send(" World!");
})
// Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

app.get("/", (req, res) => {
    res.write("Hello");
    res.write(" World!");
    res.end();
})
// Works fine

我看不到在 res.send 之后如何设置标题,因为 res.send 是设置标题的人。

我在网上看到 res.send 相当于 res.write + res.end,但这表明它并不完全正确。

我希望能够将基本数据写入响应,然后使用 res.send 来完成这项有用的任务,例如根据发送的数据自动设置 Content-Type 标头。

app.use((req, res, next) => {
    res.write("Base data");
    next();
})

app.get("/", (req, res) => {
    res.send("Route specific data");
})
// Result: Base data + Route specific data

除了 res.write 之外,还有什么可以让我将数据写入响应但不与 res.send 冲突的东西吗?

【问题讨论】:

标签: javascript node.js api express


【解决方案1】:

res.write 开始写入正文,但在它可以这样做之前,它必须写入所有标题,之后您不能再写入任何额外的标题。但是res.send 会根据其参数是 Javascript 对象还是字符串来编写额外的 Content-Type 标头。因此,您不能在res.write 之后使用res.send

res.send 旨在单独使用,例如 res.jsonres.render

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2017-11-25
    • 2011-07-24
    • 2018-06-10
    • 2018-08-08
    • 2017-12-22
    • 2018-11-12
    相关资源
    最近更新 更多