所以我有一个app.post导致这个文件:
'use strict';
function login(req, res, next) {
console.log("This line is executed");
makePromise().then(function(result){
res.cookie("key", "val");
console.log("This line isn't executed");
res.send("Ok");
});
next();
}
function makePromise() {
return new Promise(function (resolve, reject) {
resolve("Done");
});
}
module.exports = login;
但是当我请求url时,它只执行第一个console.log行,然后在不发送cookie或执行其余代码的情况下返回404。当我尝试在承诺之外设置cookie时,这不会发生。
仅供参考:显然这不是我实际想要实现的代码,而是包含我的问题的相关部分的示例。在我的代码中,我必须在我的数据库中找到一些东西才能发送到cookie,所以我必须使用promise,除非有人可以帮我找到更好的方法。
谢谢, 古尔。
答案 0 :(得分:0)
在致电next()
之前,您正在致电res.send()
。你只想打电话给其中一个。如果您要发送回复,则根本不要调用next()
,因为调用next()
会告诉Express继续与其他处理程序进行路由(如果没有处理程序,最终会以404处理程序结束)发现实际上处理它)。
因此,请删除对next()
的调用,并确保没有其他任何内容也尝试发送请求的响应:
function login(req, res, next) {
console.log("This line is executed");
makePromise().then(function(result){
res.cookie("key", "val");
console.log("This line will execute after your promise resolves");
res.send("Ok");
}).catch(function(err) {
console.log("Got error: ", err);
res.status(500).send("Error");
});
}
并且,请记住,承诺总是以异步方式解决(在未来某个时刻)。这就是为什么在您的承诺之前调用next()
时调用.then()
处理程序的原因。