问题描述
如何在将编辑好的数据保存到 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)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!