【问题标题】:NodeJs ERR_HTTP_HEADERS_SENTNodeJs ERR_HTTP_HEADERS_SENT
【发布时间】:2020-12-22 10:34:59
【问题描述】:

当我尝试在 NodeJs 中呈现页面时出现此错误,我正在尝试做的是

  1. 用户提交的表单运行良好
  2. 显示加载页面,res.render("loading")
  3. 在服务器中完成该过程后,我需要它转到另一个页面,带参数

我也试过res.redirect('/'); 我用谷歌搜索了很多解决方案,但没有任何效果,而且我还是 NodeJs 的初学者

我正在使用

"body-parser": "^1.18.3",
"consolidate": "^0.15.1",
"ejs": "^2.6.1",
"express": "^4.16.4",

错误

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (/root/payment/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/root/payment/node_modules/express/lib/response.js:170:12)
    at done (/root/payment/node_modules/express/lib/response.js:1008:10)
    at /root/payment/node_modules/consolidate/lib/consolidate.js:645:7
    at /root/payment/node_modules/consolidate/lib/consolidate.js:161:5
    at Promise._execute (/root/payment/node_modules/bluebird/js/release/debuggability.js:384:9)
    at Promise._resolveFromExecutor (/root/payment/node_modules/bluebird/js/release/promise.js:518:18)
    at new Promise (/root/payment/node_modules/bluebird/js/release/promise.js:103:10)
    at promisify (/root/payment/node_modules/consolidate/lib/consolidate.js:154:10)
    at Function.exports.ejs.render (/root/payment/node_modules/consolidate/lib/consolidate.js:641:10)
    at /root/payment/node_modules/consolidate/lib/consolidate.js:181:27
    at /root/payment/node_modules/consolidate/lib/consolidate.js:101:5
    at FSReqCallback.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:63:3)

代码

app.post("/pay", (req, res) => {
    res.render("loading");
    doPayPalOut(req, res)
});

async function doPayPalOut(req, res) {

    {... }
    await paypal.payout.create(create_payout_json, function (error, payout) {
        if (error) {
            console.log("==========", error.response);
            // throw error;
        } else {
            res.render('/success', { pdet: payout });
        }
    });


}

【问题讨论】:

    标签: javascript node.js http ejs


    【解决方案1】:

    您收到该错误是因为您多次调用 res.render() 以获得相同的响应。一旦你第一次调用它,响应头将被发送到客户端,你不能再次调用它。

    如果您真的想要某种“加载”消息,那么您应该使用 JavaScript 在客户端上实现它,而不是在服务器上。

    【讨论】:

    • 是的,但是如果我想把用户带到另一个页面呢?这可能吗?
    • 客户端的每个请求只能发送一个响应,所以无论使用哪种响应方式(res.render()res.redirect()res.send()等),都只能使用一次。所以是的,您可以调用res.redirect() 将用户从请求的页面转到另一个页面,但如果您这样做,则不能调用res.render() 或任何其他响应方法。
    猜你喜欢
    • 2021-11-04
    • 2020-03-25
    • 2022-11-22
    • 2023-03-14
    • 2021-01-25
    • 2022-01-17
    • 2021-05-28
    • 2020-12-01
    • 2020-01-23
    相关资源
    最近更新 更多