[英]Mongoose unable to create new document
我有一個文章模型定義為:
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
}
})
我有以下代碼來創建新文章並保存。
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)
}
我的預保存鈎子(幫助函數)
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定義如下。 它基本上是一堆接收輸入並返回錯誤消息(如果有)的函數。 如果沒有錯誤請返回''
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 ''
}
}
當我嘗試創建新文章時,我收到一個錯誤消息,指出created date is required
。
我已經嘗試過newArticle.markModified('statusMeta')
和newArticle.markModified( statusMeta.createdDate
),兩者都無法正常工作。 我認為沒有必要將其標記為已修改,因為它是nested object
類型,而不是mixed
類型(來自貓鼬文檔)
我也嘗試設置newArticle.statusMeta = {}
,但都不起作用。
當我設置斷點時,newArticle.statusMeta.createdDate是未定義的
我不想為createdDate使用默認值的原因是,設置默認值似乎發生在運行pre('save')掛鈎之前,這使我的驗證代碼始終失敗
這是我自己的錯誤。 在helper.js
內部,我使用了helper.funcName()
而不是helper.funcName()
exports.funcName()
。 即使使用webstorm IDE,也很難在javascript中進行調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.