如何在更新期间检查该数据是否已存在于数据库中(Mongoose 和 Express) [英] How to check if that data already exist in the database during update (Mongoose And Express)
问题描述
如何在将编辑好的数据保存到 mongoose 之前进行验证?
How to do validations before saving the edited data in mongoose?
例如,如果sample.name
已经存在于数据库中,用户将收到某种错误,类似的,这是我的代码如下
For example, if sample.name
already exists in the database, the user will receive a some sort of error, something like that, here's my code below
//Post: /sample/edit
app.post(uri + '/edit', function (req, res, next) {
Sample.findById(req.param('sid'), function (err, sample) {
if (err) {
return next(new Error(err));
}
if (!sample) {
return next(new Error('Invalid reference to sample information'));
}
// basic info
sample.name = req.body.supplier.name;
sample.tin = req.body.supplier.tin;
// contact info
sample.contact.email = req.body.supplier.contact.email;
sample.contact.mobile = req.body.supplier.contact.mobile;
sample.contact.landline = req.body.supplier.contact.landline;
sample.contact.fax = req.body.supplier.contact.fax;
// address info
sample.address.street = req.body.supplier.address.street;
sample.address.city = req.body.supplier.address.city;
sample.address.state = req.body.supplier.address.state;
sample.address.country = req.body.supplier.address.country;
sample.address.zip = req.body.supplier.address.zip;
sample.save(function (err) {
if (err) {
return next(new Error(err));
}
res.redirect(uri + '/view/' + sample._id);
});
});
});
推荐答案
通常你可以使用 mongoose 验证 但是由于您需要异步结果(现有名称的数据库查询)并且验证器不支持承诺(据我所知),您将需要创建自己的函数并传递回调.下面是一个例子:
Typically you could use mongoose validation but since you need an async result (db query for existing names) and validators don't support promises (from what I can tell), you will need to create your own function and pass a callback. Here is an example:
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
mongoose.connect('mongodb://localhost/testDB');
var UserSchema = new Schema({
name: {type:String}
});
var UserModel = mongoose.model('UserModel',UserSchema);
function updateUser(user,cb){
UserModel.find({name : user.name}, function (err, docs) {
if (docs.length){
cb('Name exists already',null);
}else{
user.save(function(err){
cb(err,user);
});
}
});
}
UserModel.findById(req.param('sid'),function(err,existingUser){
if (!err && existingUser){
existingUser.name = 'Kevin';
updateUser(existingUser,function(err2,user){
if (err2 || !user){
console.log('error updated user: ',err2);
}else{
console.log('user updated: ',user);
}
});
}
});
更新:更好的方法
pre hook 似乎是一个更自然的停止保存的地方:
The pre hook seems to be a more natural place to stop the save:
UserSchema.pre('save', function (next) {
var self = this;
UserModel.find({name : self.name}, function (err, docs) {
if (!docs.length){
next();
}else{
console.log('user exists: ',self.name);
next(new Error("User exists!"));
}
});
}) ;
更新 2:异步自定义验证器
看起来 mongoose 现在支持异步自定义验证器,所以这可能是自然的解决方案:
It looks like mongoose supports async custom validators now so that would probably be the natural solution:
var userSchema = new Schema({
name: {
type: String,
validate: {
validator: function(v, cb) {
User.find({name: v}, function(err,docs){
cb(docs.length == 0);
});
},
message: 'User already exists!'
}
}
});
这篇关于如何在更新期间检查该数据是否已存在于数据库中(Mongoose 和 Express)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!