2016-01-23 23 views
1

我試圖在我的架構中實現一個計數器來獲取下一個問題編號。我已經在Mongoose中實現了鉤子預保存鉤子,並且一切看起來都很好......除了實際的「數字」字段沒有更新。我可以很容易的告訴鉤子正在被登錄到控制檯的東西觸發,即使這個字段似乎被分配了。但是,唉,無論我嘗試什麼,「數字」字段都不會在結果中出現。Mongoose預保存掛鉤是射擊,但不保存附加字段(不使用model.update)

我已經看到一些與Mongoose鉤子有關的問題,但它們都似乎與findOneAndUpdate或類似的,我沒有使用。

這是我在底部的掛鉤完整的模型:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var Project = require('./projects.js'); 

var IssueSchema = new Schema({ 
    title: {type: String, required: true, trim: true, index: true}, 
    number: {type: Number}, 
    description: {type: String, required: true}, 
    vote_up: {type: Number, default: 0}, 
    vote_down: {type: Number, default: 0}, 
    comments: [new Schema({ 
     _id: {type: Schema.ObjectId, ref: 'users'}, 
     description : {type: String}, 
     likes: {type: Number}, 
     date: {type: Date} 
    })], 
    attachments: [], 
    fields: [new Schema({ 
     _id: {type: Schema.ObjectId, ref: 'fields'}, 
     value : {type: String} 
    })], 
    project: {type: Schema.ObjectId, required: true, index: true, ref: 'projects'}, 
    tags: {type: [Schema.ObjectId], required: false, default: ['56a2a0b1ea805d403f6d014b']}, 
    isResolved: {type: Boolean, default: false}, 
    created_by: {type: Schema.ObjectId, required: true, ref: 'users'}, 
    updated_by: {type: Schema.ObjectId, required: false, ref: 'users'}, 
    created_at: {type: Date, default: Date.now}, 
    updated_at: {type: Date, default: Date.now} 
}); 

IssueSchema.pre('save', function(next){ 
    var now = new Date(); 
    this.updated_at = now; 
    if(!this.created_at) { 
     this.created_at = now; 
    } 
    next(); 
}) 
.pre('save', function(next) { 
    Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('pre-save hook firing'); 
     this.number = doc.numberSeq; 
     console.log(this.number); 
     next(); 
    }); 
}) 
.post('save', function(doc) { 
    Project.update({_id: doc.project}, {$inc: {numberSeq: 1}}, function(err, result) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('Updated next number in seq for ' + doc.project); 
    }); 
}); 

module.exports = mongoose.model('issues', IssueSchema); 

並插入該問題的途徑(我猜測這是不是哪裏的問題)

app.post('/api/issue/create', function(req, res) { 

    var issue = new Issues({ 
     title: req.body.title, 
     description: req.body.description, 
     fields: req.body.fields, 
     attachments: req.body.attachments, 
     project: req.body.project, 
     created_by: req.user || req.body.created_by, 
    }); 

    issue.save(function(err, result) { 
     if (err) { 
     return res.status(409).send({message: 'There was an error creating the issue: ' + err}); 
     } 
     if (!result.number) { 
     console.log('number = :('); 
     } 
     console.log(result); 
     res.send({message: 'New issue created', result: result}); 
    }); 
    }); 

Screenshot of result from console with logging

回答

4

您在this背景在這裏失去了出來,

.pre('save', function(next) { 
    Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('pre-save hook firing'); 
     this.number = doc.numberSeq; 
     console.log(this.number); 
     next(); 
    }); 
}) 

,你說:

this.number = doc.numberSeq; 
console.log(this.number); 

實際上指的是findOne查詢的回調函數,因此你插入正確的console.log和錯誤的數據結束了。

你可以記住預存儲鉤子的這個上下文,然後在回調中使用該上下文更新數字。如下所示:

.pre('save', function(next) { 
    var tat=this; 
    Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('pre-save hook firing'); 
     tat.number = doc.numberSeq; 
     console.log(tat.number); 
     next(); 
    }); 
}) 
+0

工作就像一個魅力。我應該知道那個! –

相關問題