我正在使用具有快速框架和mongoose的NodeJS,我使用逻辑进行城镇输入,其中没有输入,正确输入和已经存在的输入 . 也许有更好的解决方案,但这工作正常:
router.post('/create', (req, res)=>{
let errors = [];
if (!req.body.name) {
errors.push({message: 'Add town name!'});
}
if (errors.length > 0) {
res.render('admin/towns/index', {
errors: errors,
name: req.body.name
});
} else {
Town.findOne({name: req.body.name}).then(town=>{
if (!town) {
const newTown = Town({
name: req.body.name
});
newTown.save().then(savedTown=>{
req.flash('success_message', `Town ${savedTown.name} is activated`);
res.redirect('/admin/towns');
});
} else {
req.flash('error_message', 'Town name already exist!');
res.redirect('/admin/towns');
}
});
}
});
但是,当我想要更新,哪里没有输入工作正常,其中名称是新的也工作正常,但如果名称存在,它显示我错误:
(node:12140)UnhandledPromiseRejectionWarning:MongoError:E11000重复键错误集合:crm_electors.towns index:name_1 dup key:{:“Belgrade”}
router.put('/edit/:id', (req, res)=>{
let errors = [];
if (!req.body.name) {
errors.push({message: 'Add town name!'});
}
if (errors.length > 0) {
res.render('admin/towns/index', {
errors: errors,
name: req.body.name
});
} else {
Town.findOne({_id: req.params.id}).then(town=>{
if (req.body.name !== town) { // I guess this logic is wrong
town.name = req.body.name;
town.save().then(savedTown=>{
req.flash('success_message', 'Town name successfully renamed');
res.redirect('/admin/towns');
});
} else {
req.flash('error_message', 'Town name already exist!');
res.redirect('/admin/towns');
}
});
}
});
我认为这个逻辑是错误的(req.body.name!== town),所以我尝试了req.body.name!== town.name和一些更多的变化,但没有运气 .
1 回答
Mongoose在错误第一次回调时工作,其中回调具有
error
作为它的第一个参数,而result
在第二个参数中 . 您拥有的代码误导error
与result
作为findOne
回调中的第一个参数是您使用变量town
引用的错误 . 因此,您需要将代码更改为:因为,
town
在回调的第二个参数中它保存了猫鼬模型记录 . 因此,您可以从中访问name
属性 . 此外,您还可以通过在回调中使用此代码块在回调中使用err
参数来处理运行时错误: