NodeJS MongoDB 回调地狱
NodeJS MongoDB Callback Hell
我仍然遇到条件和数据库回调的问题,我编写了一个查询违规对象的路由函数,这是来自客户端填写的表单。我正在尝试更改拥有此违规行为的用户作为一个选项,我查询该用户并且 return 它很好但是在 if 语句中,x != y 将始终 return true 因为性质我是如何写的。我希望它完成查询,然后命中条件。我对如何解决这个问题感到有点困惑。
if(viol.user != user[0]._id)
这样当我编辑拥有该违规行为或对象的用户时,用户不会一遍又一遍地向自己添加相同的对象。
app.post('/singleViolation/:violation', isAdmin, function(req, res) {
var violation = req.params.violation;
Violation.findById(violation, function(err, viol){
if (err) throw err;
if (req.body.cause === '') {
req.body.cause = viol.cause;
}
if (req.body.date === '') {
req.body.date = viol.date;
}
if (req.body.location === '') {
req.body.location = viol.location;
}
if(req.body.email === '') {
req.body.email == viol.user;
}
if( req.body.email != '') {
User.find({"local.email" : req.body.email}, function (err, user) {
if (err) {
req.body.email = viol.user;
}
if(viol.user != user[0]._id) {
typeof viol.user;
typeof user[0].id;
console.log(viol.user);
console.log(user[0]._id);
console.log(viol.user === user[0].id);
viol.user = user[0];
viol.save();
user[0].local.violations.push(viol);
Vehicles.findById(viol.vehicle, function(err, veh) {
user[0].local.vehicles.push(veh);
veh.owner = user[0];
veh.save();
user[0].save();
});
}
});
}
viol.cause = req.body.cause;
viol.date = req.body.date;
viol.location = req.body.location;
viol.save();
});
res.json(req.body);
});
app.get('/editViolations/:violations', isAdmin, function(req, res) {
res.render('editViolations.ejs');
});
您需要使用事件来实现您想要的。下面只是一个高级解决方案。
- 查询结束触发事件
- 将上述事件与您的条件语句相关联。
- 当您满足要求的条件时触发另一个事件。
- 将此事件与您的 return 声明相关联。
阅读this good tutplus blog to wrap your head around node event module。
我相信您应该首先了解回调函数的概念以及如何避免回调地狱
下面的链接将帮助您开始使用回调
我仍然遇到条件和数据库回调的问题,我编写了一个查询违规对象的路由函数,这是来自客户端填写的表单。我正在尝试更改拥有此违规行为的用户作为一个选项,我查询该用户并且 return 它很好但是在 if 语句中,x != y 将始终 return true 因为性质我是如何写的。我希望它完成查询,然后命中条件。我对如何解决这个问题感到有点困惑。
if(viol.user != user[0]._id)
这样当我编辑拥有该违规行为或对象的用户时,用户不会一遍又一遍地向自己添加相同的对象。
app.post('/singleViolation/:violation', isAdmin, function(req, res) {
var violation = req.params.violation;
Violation.findById(violation, function(err, viol){
if (err) throw err;
if (req.body.cause === '') {
req.body.cause = viol.cause;
}
if (req.body.date === '') {
req.body.date = viol.date;
}
if (req.body.location === '') {
req.body.location = viol.location;
}
if(req.body.email === '') {
req.body.email == viol.user;
}
if( req.body.email != '') {
User.find({"local.email" : req.body.email}, function (err, user) {
if (err) {
req.body.email = viol.user;
}
if(viol.user != user[0]._id) {
typeof viol.user;
typeof user[0].id;
console.log(viol.user);
console.log(user[0]._id);
console.log(viol.user === user[0].id);
viol.user = user[0];
viol.save();
user[0].local.violations.push(viol);
Vehicles.findById(viol.vehicle, function(err, veh) {
user[0].local.vehicles.push(veh);
veh.owner = user[0];
veh.save();
user[0].save();
});
}
});
}
viol.cause = req.body.cause;
viol.date = req.body.date;
viol.location = req.body.location;
viol.save();
});
res.json(req.body);
});
app.get('/editViolations/:violations', isAdmin, function(req, res) {
res.render('editViolations.ejs');
});
您需要使用事件来实现您想要的。下面只是一个高级解决方案。
- 查询结束触发事件
- 将上述事件与您的条件语句相关联。
- 当您满足要求的条件时触发另一个事件。
- 将此事件与您的 return 声明相关联。
阅读this good tutplus blog to wrap your head around node event module。
我相信您应该首先了解回调函数的概念以及如何避免回调地狱 下面的链接将帮助您开始使用回调