ForestAdmin / forest-express-mongoose

🌱 ExpressJS/Mongoose agent for Forest Admin to integrate directly to your existing ExpressJS/Mongoose backend application.
https://www.forestadmin.com
GNU General Public License v3.0
193 stars 28 forks source link

Mongoose hooks #121

Closed Christilut closed 5 years ago

Christilut commented 6 years ago

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

Christilut commented 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.

arnaudbesnier commented 5 years ago

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. 🤓

FarazPatankar commented 5 years ago

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.

joshnissenbaum commented 5 years ago

Really need this ASAP

IgorDavy commented 5 years ago

Actually the problem comes from Mongoose : "Pre and post save() hooks are not executed on update()" https://mongoosejs.com/docs/middleware.html

Christilut commented 5 years ago

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.

slimee commented 5 years ago

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);
});
slimee commented 5 years ago

Solution provided in the last message.