无法在承诺ExpressJS中设置响应cookie

时间:2017-07-04 00:11:50

标签: javascript node.js express cookies promise

所以我有一个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,除非有人可以帮我找到更好的方法。

谢谢, 古尔。

1 个答案:

答案 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()处理程序的原因。