簡體   English   中英

Express 404:“發送到客戶端后無法設置標頭”

[英]Express 404: “Cannot set headers after they are sent to the client”

我正在開發 Node/Express 應用程序,如果 promise function 無法解決,我希望它返回 404 頁面。

這就是我嘗試這樣做的方式:

app.get("/projects", t("projects", function(req, res) {
    res.header("Cache-Control", "private, max-age=0, no-cache, no-store");
    return projects.list(req.user, req.query)
        .then((projects) => (Object.assign(projects, { company_name: req.user.company_name })))
        .catch(() => res.status("404").send(""));
}));

不幸的是,這使我的應用程序崩潰並出現錯誤Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

當且僅當 promise 拒絕時,我怎樣才能使它成為 404s 而不會導致應用程序崩潰?

作為記錄, projects.list function 非常簡單,它只是進行數據庫調用並返回 object。

function list(user, query_params) {
    const folder = query_params.folder || "all";
    return entity.User.listedProjects(user.id, filter_by)
        .then((projects) => {
            if (folder !== null && !projects.some(t => t.current)) {
                return Promise.reject();
            }
            return {
                "projects": projects,
                "active_folder": folder
            };
        });
}

更新:根據要求,這是t function:

function t(template_name, get_additional_params, options={}) {
    return function(req, res) {
        if (!req.user && !options.do_not_require_login) return res.redirect("/login?redirect=" + encodeURIComponent(req.originalUrl));

        if (!get_additional_params) {
            get_additional_params = (() => Promise.resolve({}));
        }

        get_additional_params(req, res)
            .then(function(additional_params) {
                if (additional_params && "_redirect" in additional_params) {
                    return res.redirect(additional_params._redirect);
                }

                const standard_params = {
                    "error": req.flash("error"),
                };

                const params = Object.assign({}, additional_params, standard_params);
                res.render(template_name + ".html", params);
            })
            .catch(utils.fail(req, res));
    };
}

.catch(...)導致解析 promise 所以可能在你的t function 內你試圖發送額外的標題。

作為一個快速修復,你可以用

.catch(err => {
  res.status("404").send("");
  throw err;
});

並且您的t function 不會嘗試設置其他標頭

app.get("/projects", t("projects", function(req, res) {

return projects.list(req.user, req.query)
    .then((projects) => (Object.assign(projects, { company_name: req.user.company_name })))
    .then(() => res.header("Cache-Control", "private, max-age=0, no-cache, no-store"))
    .catch(() => res.status("404").send(""));
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM