mongoose无法创build新文档

我有一个文章模型定义为:

var ArticleSchema = new Schema({ type: String ,title: String ,content: String ,comments: [{ type: Schema.ObjectId ,ref: 'Comment' }] ,replies: [{ type: Schema.ObjectId ,ref: 'Reply' }] ,feedbacks: [{ type: Schema.ObjectId ,ref: 'Feedback' }] ,meta: { tags: [String] //anything ,apps: [{ store: String //app store, google play, amazon app store ,storeId: String }] ,category: String } //normal, deleted, banned , status: String ,statusMeta: { createdBy: { type: Schema.ObjectId ,ref: 'User' } ,createdDate: Date , updatedBy: { type: Schema.ObjectId ,ref: 'User' } ,updatedDate: Date ,deletedBy: { type: Schema.ObjectId, ref: 'User' } ,deletedDate: Date ,undeletedBy: { type: Schema.ObjectId, ref: 'User' } ,undeletedDate: Date ,bannedBy: { type: Schema.ObjectId, ref: 'User' } ,bannedDate: Date ,unbannedBy: { type: Schema.ObjectId, ref: 'User' } ,unbannedDate: Date } }) 

我有以下代码来创build一个新的文章并保存它。

 var newArticle = new Article() newArticle.status = helper.constant.articleTypes.other newArticle.type = req.body.type newArticle.category = req.body.category newArticle.title = req.body.title newArticle.content = req.body.content newArticle.meta = req.body.meta newArticle.statusMeta.createdBy = req.user newArticle.statusMeta.createdDate = new Date newArticle.save(function(err) { if (err) return next(err) } 

我的预存钩子(帮手function)

 exports.batchValidationWrapper = function(schema, module, fieldPaths) { for (var i = 0; i < fieldPaths.length; i++) { var fieldPath = fieldPaths[i] ;(function(fieldPath) { schema.pre('save', true, function(next, done) { var self = this var validationFunction = exports.validation[module][fieldPath] var msg = validationFunction(self[fieldPath]) if (msg) { self.invalidate(fieldPath, msg) done(msg) } else { done() } }) })(fieldPath) } } 

在我的模型中,我打电话给帮手

 helper.batchValidationWrapper(ArticleSchema, 'article', [ 'type' ,'title' ,'content' ,'comments' ,'replies' ,'feedbacks' ,'meta.tags' ,'meta.apps' ,'meta.category' ,'status' ,'statusMeta.createdBy' ,'statusMeta.createdDate' ,'statusMeta.deletedBy' ,'statusMeta.deletedDate' ,'statusMeta.undeletedBy' ,'statusMeta.undeletedDate' ,'statusMeta.bannedBy' ,'statusMeta.bannedDate' ,'statusMeta.unbannedBy' ,'statusMeta.unbannedDate' ]) 

helper.validation定义如下。 它基本上是一堆接收input并返回错误消息的函数。 如果没有错误只是返回''

 exports.article = { type: function(input) { if (!input) return 'type is requried' return passIfAmongTypes('Article', input, constant.articleTypes) } ,'statusMeta.createdDate': function(input) { if (!input) return 'created date is required' return '' } } 

当我尝试创build新文章时,出现错误,说created date is required

我已经尝试newArticle.markModified('statusMeta')和newArticle.markModified( statusMeta.createdDate ),都不工作。 我不认为有必要标记它修改,因为它是nested objecttypes,而不是mixedtypes(从mongoose文档)

我也尝试设置newArticle.statusMeta = {} ,不工作。

当我设置中断点时,newArticle.statusMeta.createdDate是未定义的

我不想使用默认值为createdDate的原因是,设置默认似乎发生之前运行前('保存')钩子,这使得我的validation代码总是失败

这是我自己的错误。 在helper.js里面我使用了helper.funcName()而不是helper.funcName() exports.funcName() 。 即使使用webstorm IDE,也很难在JavaScript中进行debugging。