我将mongodb用于make后端API。而且我已经使用bluebird
来使用promise。
return new promise((resolve, reject) => {
db.collection('employee').find({
email: data.email
}).toArray().then((checkEmail) => {
if (checkEmail.length > 0) {
res.send({ status: 0, message: 'Employee already exist.' });
// I want to stop my node hear.
// I have tried return false , but not works.
}
}).then(() => {
// Add employee details into collection as a new employee.
return db.collection('employee').insert({
//...
})
}).then((employee) => {
// Other stuff
}).catch((error) => {
console.log(error)
res.send({ status: 0, message: 'Something went wrong.' });
});;
}
如您所见,如果checkEmail > 0
,那么我已经发送了我在邮递员那里得到的回复。但是我的节点仍然是执行下一个代码。
所以,当我发回res时,如何停止下一次执行。
我已经发送了res到客户端,然后它也执行了下一个代码,在其他部分,我也发送了成功/错误的res。这就是为什么我得到这个错误。
Error: Can't set headers after they are sent.
我尝试使用return
,return false
。但是它仍然执行我的下一个代码。
答案 0 :(得分:1)
不需要在return语句中创建新的Promise,如果需要使用方法来生成Promise,则可以返回链本身。
从承诺链中的then
返回并不会停止该链,它只是将返回的值作为参数传递给下一个then
。绕过该错误的一种方法是引发您自己的自定义错误,并在catch
中进行适当处理。这样的事情应该起作用:
return db
.collection("employee")
.find({email: data.email})
.toArray()
.then(checkEmail => {
if (checkEmail.length > 0) {
let err = new Error("Employee already exists.");
err.code = "EMPLOYEE_ALREADY_EXISTS";
throw err;
}
})
.then(() => {
// Add employee details into collection as a new employee.
return db.collection("employee").insert({
//...
});
})
.then(employee => {
// Other stuff
})
.catch(error => {
if (error.code && error.code === "EMPLOYEE_ALREADY_EXISTS") {
res.send({ status: 0, message: "Employee already exists." });
} else {
console.log(error);
res.send({ status: 0, message: "Something went wrong." });
}
});
编辑:再次说明一下,第三个then
中的雇员将是您从上一个then
返回的雇员,即db.collection("employee").insert({...})
返回的雇员。
答案 1 :(得分:0)
您可以像兑现您的诺言
db.collection('employee')
.find({
email: data.email
})
.toArray()
.then((checkEmail) => {
if (checkEmail.length > 0) {
return res.send({ status: 0, message: 'Employee already exist.'});
}
else
{
return db.collection('employee').insert({
//...
})
.then((employee) => {
// Other stuff})
})
}
})
.catch((error) => {
console.log(error)
res.send({ status: 0, message: 'Something went wrong.' });
});
或者您也可以通过将其与不同的onSuccess调用绑定来分支您的Promise。 一个分支将决定是否发送消息。由于承诺是链接在一起的,所以唯一的方法是像其他分支一样,将状态传递到整个承诺链中。
let exists = db.collection('employee')
.find({
email: data.email
})
.toArray()
exists.then((checkEmail)=>{
if(checkEmail.length > 0){
return res.send({ status: 0, message: 'Employee already exist.'});
//ends the excution here
}
})
exists.then((checkEmail)=>{
return checkEmail.length === 0;
}
})
.then((createUser) => {
if(createUser){
return db.collection('employee').insert({
//...
})
else
return createUser
}
})
.then((createUser)=> {
if(createUser) {
// Other stuff
}
})
.catch((err)=>{
console.log(error)
res.send({ status: 0, message: 'Something went wrong.' });
})