我有以下代码:
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
答案 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);
相同,并将继续承诺链。