Mongoose验证会触发错误,但仍会存储数据

时间:2013-12-28 22:29:23

标签: node.js mongoose

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' } } }

我认为我误解了这应该如何工作,但我找不到错误。

1 个答案:

答案 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) {});
        });
    });
});

如果您仍然可以看到数据,则可能意味着您没有清除数据所在的集合的内容。