Closed Christilut closed 5 years ago
Is this going to get fixed? This completely prevents anyone from using Forest in combination with Mongoose right now. Sure someone might not use hooks but as soon as they do, Forest falls apart.
Hi @Christilut, Thanks for the feedback, I am sorry but I cannot provide any ETA for a fix.
As a side note, I am not sure that Mongoose hooks are widely used as we have a lot of customers using Mongoose without any concern.
As the liana code is open source, it would make us very happy if you could contribute and fix it. 🤓
Hey @arnaudbesnier,
Any update on this issue? Also, if you guys have other issues to fix first, could you give me some pointers on how to fix this? I might pick it up myself.
Really need this ASAP
Actually the problem comes from Mongoose : "Pre and post save() hooks are not executed on update()" https://mongoosejs.com/docs/middleware.html
Not entirely. When using findByIdAndUpdate
for example, no document is ever loaded in mongoose so no hook can be executed.
But when doing a findOne
call and then save
the hooks will be executed. But I guess ForestAdmin implemented it with update calls. They could change it to save
calls but it would incur extra overhead.
Personally I think it should work like the second method because hooks not firing is not developer friendly and a surprise for anyone working with this. Especially since we have no say in what an update call actually does, the hooks were the perfect place to add extra logic.
All these hooks are working on Forest/mongoose. You can use the following examples inside a mongoose model definition file. If you have an issue using hooks please provide a reproducing minimal code and versions in a new ticket.
To capture new record creation:
schema.pre('save', function () {
console.log('YOU will save a user');
});
schema.post('save', function (doc) {
console.log('YOU just saved a user', doc);
});
schema.pre('validate', function() {
console.log('you will validate users');
});
schema.post('validate', function() {
console.log('you just validated users');
});
To capture record update:
schema.pre('findOneAndUpdate', function () {
console.log('YOU will update a user');
});
schema.post('findOneAndUpdate', function (doc) {
console.log('YOU just updated a user', doc);
});
To capture record deletion (from list or from record details) from Forest:
schema.pre('remove', { query: true, document: false }, function () {
console.log('YOU will query remove a user');
});
schema.post('remove', { query: true, document: false }, function (doc) {
console.log('YOU just query removed a user', doc);
});
Solution provided in the last message.
Expected behavior
I would expect that mongoose hooks are executed, eg
pre('save', ...
Actual behavior
When saving a document through the forest admin interface, the document is updated in the database but hook was never executed.
Hook does execute when I run the
save()
function in my code.Context