mongoose文档声称如果验证失败,它将不会存储数据。但是,以下代码确实存储了发布到/ api / orders的无效数据。 console.write确实打印了预期的错误,但此时数据已经存在于数据库中。
http://mongoosejs.com/docs/api.html#document_Document-validate“这个 方法称为预保存,如果违反了验证规则,则保存 中止,错误将返回到您的回调。“
代码:
app.post('/api/orders', function(req, res) {
var OrderItem = new Order(req.body);
OrderItem.save(function (err) {
if (err) {
console.log(req.body);
console.log(err);
}
res.send(OrderItem);
});
});
var orderSchema = mongoose.Schema({
user: {type: String, required: true, match: /^[a-zA-Z]{1,8}$/}, //\p{L}
lines: [{
name: String,
count: {type: Number, required: true, min: 0, max: 5}
}]
});
var Order = mongoose.model('Order', orderSchema);
无效数据:
{ user: '0123456789', lines: [] }
错误讯息:
{ message: 'Validation failed',
name: 'ValidationError',
errors:
{ user:
{ message: 'Path `user` is invalid (0123456789).',
name: 'ValidatorError',
path: 'user',
type: 'regexp',
value: '0123456789' } } }
我认为我误解了这应该如何工作,但我找不到错误。
答案 0 :(得分:0)
无效数据肯定不会存储在数据库中。在计算机上使用以下测试以确保没有mongoose保存文档。
var mongoose = require('mongoose');
var assert = require('assert');
mongoose.connect('mongodb://localhost:27017/sotest');
var orderSchema = mongoose.Schema({
user: {type: String, required: true, match: /^[a-zA-Z]{1,8}$/}, //\p{L}
lines: [{
name: String,
count: {type: Number, required: true, min: 0, max: 5}
}]
});
var Order = mongoose.model('Order', orderSchema);
var OrderItem = new Order({ user: '0123456789', lines: [] });
Order.collection.remove(function(err) {
OrderItem.save(function (err) {
if (err) {
console.log(err);
}
Order.find({}, function(err, docs) {
console.log(docs);
assert(docs.length == 0, "No documents should be saved in the db!");
Order.collection.remove(function(err) {});
});
});
});
如果您仍然可以看到数据,则可能意味着您没有清除数据所在的集合的内容。