Mongoose创建与新建/保存
我有一个带有必填字段Mongoose创建与新建/保存,mongoose,Mongoose,我有一个带有必填字段name的食物模式。出于某种原因,当我尝试使用create函数(如下)创建食物项目时,它会抛出一个ValidationError:Path'name'是必需的,即使我的对象确实有一个name字段: Food.create({ name: "milk", daysUntilExpiration: 5 }); Mongoose: foods.insert({ name: 'milk', daysUntilExpiration: 5, _id: ObjectId(
name
的食物模式。出于某种原因,当我尝试使用create
函数(如下)创建食物项目时,它会抛出一个ValidationError:Path'name'是必需的
,即使我的对象确实有一个name字段:
Food.create({
name: "milk",
daysUntilExpiration: 5
});
Mongoose: foods.insert({ name: 'milk', daysUntilExpiration: 5, _id: ObjectId("59608100cb0578165dd35de9"), __v: 0 })
我的mongoose调试输出还显示它正在执行插入,并且正在保存的对象具有名称字段:
Food.create({
name: "milk",
daysUntilExpiration: 5
});
Mongoose: foods.insert({ name: 'milk', daysUntilExpiration: 5, _id: ObjectId("59608100cb0578165dd35de9"), __v: 0 })
另一方面,如果我创建一个新对象,然后保存,它将按预期工作:
f = new Food({ name: "milk", daysUntilExpiration: 5 });
f.save() // no validation error!
为什么这种行为不同?我的印象是,create和new/save之间的区别纯粹是为了编程方便(希望在创建对象之后,但在保存到数据库之前使用对象),但似乎我错了
编辑:验证错误的堆栈跟踪:
ValidationError: Food validation failed: name: Path `name` is required.
at ValidationError.inspect (/Users/jess/herb/node_modules/mongoose/lib/error/validation.js:63:24)
at formatValue (util.js:352:36)
at inspect (util.js:186:10)
at exports.format (util.js:72:24)
at Console.log (console.js:43:37)
at tryCatcher (/Users/jess/herb/node_modules/bluebird/js/main/util.js:26:23)
at Promise._settlePromiseFromHandler (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:507:31)
at Promise._settlePromiseAt (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:581:18)
at Promise._settlePromises (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:697:14)
at Async._drainQueue (/Users/jess/herb/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/Users/jess/herb/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues (/Users/jess/herb/node_modules/bluebird/js/main/async.js:15:14)
at runCallback (timers.js:651:20)
at tryOnImmediate (timers.js:624:5)
at processImmediate [as _immediateCallback] (timers.js:596:5)
errors:
{ name:
{ MongooseError: Path `name` is required.
at ValidatorError (/Users/jess/herb/node_modules/mongoose/lib/error/validator.js:24:11)
at validate (/Users/jess/herb/node_modules/mongoose/lib/schematype.js:744:13)
at /Users/jess/herb/node_modules/mongoose/lib/schematype.js:790:11
at Array.forEach (native)
at SchemaString.SchemaType.doValidate (/Users/jess/herb/node_modules/mongoose/lib/schematype.js:750:19)
at /Users/jess/herb/node_modules/mongoose/lib/document.js:1462:9
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
message: 'Path `name` is required.',
name: 'ValidatorError',
properties: [Object],
kind: 'required',
path: 'name',
value: undefined,
reason: undefined } },
_message: 'Food validation failed',
name: 'ValidationError' }
var mongoose = require('mongoose');
var schema = new mongoose.Schema({
name: {
type: String,
required: true,
min: 1,
max: 100
},
daysUntilExpiration: {
type: Number,
min: 0
}
});
module.exports = mongoose.model('Food', schema);
编辑2:食物模式:
ValidationError: Food validation failed: name: Path `name` is required.
at ValidationError.inspect (/Users/jess/herb/node_modules/mongoose/lib/error/validation.js:63:24)
at formatValue (util.js:352:36)
at inspect (util.js:186:10)
at exports.format (util.js:72:24)
at Console.log (console.js:43:37)
at tryCatcher (/Users/jess/herb/node_modules/bluebird/js/main/util.js:26:23)
at Promise._settlePromiseFromHandler (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:507:31)
at Promise._settlePromiseAt (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:581:18)
at Promise._settlePromises (/Users/jess/herb/node_modules/bluebird/js/main/promise.js:697:14)
at Async._drainQueue (/Users/jess/herb/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/Users/jess/herb/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues (/Users/jess/herb/node_modules/bluebird/js/main/async.js:15:14)
at runCallback (timers.js:651:20)
at tryOnImmediate (timers.js:624:5)
at processImmediate [as _immediateCallback] (timers.js:596:5)
errors:
{ name:
{ MongooseError: Path `name` is required.
at ValidatorError (/Users/jess/herb/node_modules/mongoose/lib/error/validator.js:24:11)
at validate (/Users/jess/herb/node_modules/mongoose/lib/schematype.js:744:13)
at /Users/jess/herb/node_modules/mongoose/lib/schematype.js:790:11
at Array.forEach (native)
at SchemaString.SchemaType.doValidate (/Users/jess/herb/node_modules/mongoose/lib/schematype.js:750:19)
at /Users/jess/herb/node_modules/mongoose/lib/document.js:1462:9
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
message: 'Path `name` is required.',
name: 'ValidatorError',
properties: [Object],
kind: 'required',
path: 'name',
value: undefined,
reason: undefined } },
_message: 'Food validation failed',
name: 'ValidationError' }
var mongoose = require('mongoose');
var schema = new mongoose.Schema({
name: {
type: String,
required: true,
min: 1,
max: 100
},
daysUntilExpiration: {
type: Number,
min: 0
}
});
module.exports = mongoose.model('Food', schema);
它怎么能既抛出错误又插入文档?@robertklep正是我想知道的!对此有一个合理的解释:Mongoose日志记录可能发生在插入实际成功之前。是Mongoose执行验证,而不是MongoDB本身,因此Mongoose甚至会在考虑插入内容之前抛出错误。我认为这个错误实际上是在其他地方抛出的。随附的堆栈跟踪可能会提供一些线索。您还可以包括您的架构和您定义的任何其他预保存挂钩/验证吗?它如何既抛出错误又插入文档?@robertklep正是我想知道的!对此有一个合理的解释:Mongoose日志记录可能发生在插入实际成功之前。是Mongoose执行验证,而不是MongoDB本身,因此Mongoose甚至会在考虑插入内容之前抛出错误。我认为这个错误实际上是在其他地方抛出的。随附的堆栈跟踪可能会提供一些线索。您还可以包括您的模式和您定义的任何其他预保存挂钩/验证吗?