pre save middleware in mongoose

左心房为你撑大大i 提交于 2021-01-29 16:20:31

问题


i am first time using pre save middleware and getting a bit confusion in it.

It runs perfectly fine and also my save method is getting executed eventhough i am not calling the next()

case 1

tourSchema.pre('save', function () {
  console.log('first middleware is getting called');
})

But when i do like this when next is declared inside the function params but i don't call the next() it hangs there and the save method is not getting executed

case 2

tourSchema.pre('save', function (next) {
  console.log('first middleware is getting called');
});

But as soon as i call the next() it gets executed

case 3

tourSchema.pre('save', function (next) {
  console.log('first middleware is getting called');
  next()
});

so i only want to know what's the wrong with the second case . In this i have only and only this pre middleware . How defining the next inside the function params can matter, the save method should also be executed in the second case since i don't have any second pre middleware.


回答1:


mongoose uses kareem library to manage hooks.

kareems makes use of the length property of your hook function to determine whether next is defined as an argument or not.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length

Your first function has no arguments, kareem will assume this is a sync function

const firstFunction = function () {
  console.log('first middleware is getting called');
})
console.log(firstFunction.length) // this will output 0

Your second function has 1 argument, the kareem library will see your function accept next arguments. It will pass a callback and execute it in the next function. Since next is never called, that callback will be never called.

const secondFunction = function (next) {
  console.log('first middleware is getting called');
})
console.log(secondFunction.length) // this will output 1


来源:https://stackoverflow.com/questions/61466548/pre-save-middleware-in-mongoose

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!