[英]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.