【问题标题】:Mongoose validation triggers error but data is still storedMongoose 验证触发错误,但数据仍被存储
【发布时间】:2013-12-30 07:12:14
【问题描述】:

猫鼬文档声称,如果验证失败,它将不会存储数据。但是,以下代码确实存储了发布到 /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' } } }

我想我误解了它应该如何工作,但我找不到错误。

【问题讨论】:

  • 你可以试试 if (err) console.log(err);而不是 console.log(err);并分享结果?
  • 您能否编辑您的问题以包含验证失败但正在保存的文档?
  • 您如何断定项目已保存?因为使用完全相同的代码,我得到一个无效条目的验证错误,并且它根本没有存储在数据库中。
  • 我可以在我的数据库中看到无效数据。我现在将添加无效数据和错误。

标签: node.js mongoose


【解决方案1】:

无效数据肯定不会存入数据库。在您的计算机上使用以下测试以确保 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) {});
        });
    });
});

如果你还能看到数据,那很可能是你没有清除数据所在的集合的内容。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2018-01-14
    • 2012-09-14
    • 2020-12-30
    • 1970-01-01
    • 2015-06-23
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多