Node.js NodeJS,承诺期间如何发送响应。然后呢?

Node.js NodeJS,承诺期间如何发送响应。然后呢?,node.js,promise,response,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].c

我有以下代码:

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
我想这是因为我在发送回复后没有违背承诺,对吗?。但我怎么才能解决这个问题呢?有什么建议吗


干杯你的问题在于你的承诺链。在第一个。然后,您总是使用res设置响应,但在下一个。然后在链中尝试再次设置响应。请注意,不从承诺返回任何内容与返回承诺相同。resolveundefined

我会这样做:

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 });
    });

还要注意,从承诺返回值与返回承诺相同。resolvevalue;,并将延续承诺链

尝试返回res.status4xx调用中的每一个res.status4xx调用没有仍然相同的警告:/似乎您在代码流中设置了res两次谢谢:如果我有另一个。那么在.thensresult之前呢?这很好,只需确保将结果传递给下一个承诺:.thenresult=>{…;return result;}