问题
I have this Schema in mongoose and when I use the pre with update, I get this error.
JobSchema.pre('update', function(n){n()})
Full error
C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\utils.js:413
throw err;
^
TypeError: Cannot read property 'numAsyncPres' of undefined
at Model._lazySetupHooks (C:\web\production01_server\node_modules\production\node_modules\mongoose\node_modules\hooks\hooks.js:149:49)
at Model.pre (C:\web\production01_server\node_modules\production\node_modules\mongoose\node_modules\hooks\hooks.js:113:10)
at Model.doQueue (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\document.js:1116:41)
at Model.Document (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\document.js:55:8)
at Model.Model (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\model.js:26:12)
at Model.model (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\model.js:910:11)
at new Model (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\connection.js:418:15)
at cb (C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\query.js:804:16)
at C:\web\production01_server\node_modules\production\node_modules\mongoose\lib\utils.js:408:16
at C:\web\production01_server\node_modules\production\node_modules\mongoose\node_modules\mongodb\lib\mongodb\cursor.js:133:9
Notes:
- pre('save' WORKS
- post('update' Doesn't throw error and doesn't works
回答1:
Mongoose 4.0 supports pre update hooks via Query middleware. http://mongoosejs.com/docs/middleware.html
schema.pre('update', function() {
console.log(this instanceof mongoose.Query); // true
this.start = Date.now();
});
schema.post('update', function() {
console.log(this instanceof mongoose.Query); // true
console.log('update() took ' + (Date.now() - this.start) + ' millis');
});
A note of caution:
"Query middleware differs from document middleware in a subtle but important way: in document middleware, this refers to the document being updated. In query middleware, mongoose doesn't necessarily have a reference to the document being updated, so this refers to the query object rather than the document being updated."
回答2:
According to the Mongoose documentation, the pre and post middleware functions support:
- init
- validate
- save
- remove
No support for update.
回答3:
It's true that Mongoose doesn't support hooks on Model APIs other than those Greg listed above. However, an update hook can be done via Monkey-patch. The Hooker NPM package is a good way of doing this cleanly.
The RESTeasy project which is a Boilerplate for Node REST APIs has code that demonstrates how to do it:
var hooker = require('hooker');
var BaseSchema = new mongoose.Schema({
sampleString: {
type: String
}
});
var BaseModel = mongoose.model('Base', BaseSchema);
// Utilize hooks for update operations. We do it in this way because MongooseJS
// does not natively support update hooks at the Schema level. This is a way
// to support it.
hooker.hook (BaseModel, 'update', {
pre: function () {
// Insert any logic you want before updating to occur here
console.log('BaseModel pre update');
},
post: function () {
// Insert any logic you want after updating to occur here
console.log('BaseModel post update');
}
});
// Export the Mongoose model
module.exports = BaseModel;
回答4:
I found this: https://github.com/LearnBoost/mongoose/issues/538 So no pre for update...
来源:https://stackoverflow.com/questions/11761819/mongoose-jobschema-preupdate-functionnn-throws-typeerror-cannot-rea