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 object
types,而不是mixed
types(从mongoose文档)
我也尝试设置newArticle.statusMeta = {}
,不工作。
当我设置中断点时,newArticle.statusMeta.createdDate是未定义的
我不想使用默认值为createdDate的原因是,设置默认似乎发生之前运行前('保存')钩子,这使得我的validation代码总是失败
这是我自己的错误。 在helper.js
里面我使用了helper.funcName()
而不是helper.funcName()
exports.funcName()
。 即使使用webstorm IDE,也很难在JavaScript中进行debugging。