NodeJS,如何在Promise .then期间发送响应?

时间:2018-11-16 13:27:07

标签: node.js promise response

我有以下代码:

User.getConfByID(userID)
    .then((item)=>{
        if(item.length == 0){
            res.status(400).json({error:"NO_USER_FOUND"})
        }else{
            if(item[0].token == token){
                if((Math.abs(Date.now() - item[0].conf_iat)) > tokenValid){
                    res.status(401).json({error: "TOKEN_INVALID"})
                }else{
                    return mariaDBTemplates.updateOneRowTemplate("User_confirmation", {confirmed:1}, "user_id", userID)
                }
            }else{
                res.status(401).json({error: "TOKEN_NOT_SAME"})
            }
        }
    })
    .then(()=>{
        res.status(200).json({success: "CONFIRMED"})
    })
    .catch((err)=>{
        res.status(500).json({error: err.message})
    })

您看到我有不同类型的错误消息以及不同类型的状态代码。当我运行此代码时,它总是向我发出此警告:

 Error: Can't set headers after they are sent

我认为这是因为我在发送回复后没有“破坏”承诺吗?但是我该如何解决呢?有什么建议吗?

Cheerio

1 个答案:

答案 0 :(得分:1)

您的问题在于您的诺言链。在您的第一个.then中,您始终使用res设置响应,但是链中的下一个.then试图再次设置响应。请注意,不从承诺中退还任何款项与return Promise.resolve(undefined);相同。

这是我要怎么做:

User.getConfByID(userID)
    .then((item) => {
        if(item.length == 0)
            return { statusCode: 400, body: { error: "NO_USER_FOUND" } };
        else {
            if(item[0].token == token) {
                if((Math.abs(Date.now() - item[0].conf_iat)) > tokenValid)
                    return { statusCode: 401, body: { error: "TOKEN_INVALID" } };
                else {
                    //not sure what this returns, but it looks like this is 
                    //what you're trying to return the 200 for
                    mariaDBTemplates.updateOneRowTemplate("User_confirmation", { confirmed: 1 }, "user_id", userID);

                    return { statusCode: 200, body: { success: "CONFIRMED" } };
                }
            } else
                return { statusCode: 401, body: { error: "TOKEN_NOT_SAME" } };
        }
    })
    .then((result) => {
        res.status(result.statusCode).json(result.body);
    })
    .catch((err) => {
        res.status(500).json({ error: err.message });
    });

还要注意,从承诺中返回值与返回Promise.resolve(value);相同,并将继续承诺链。