3
userSchema.pre('save',async function(next){
   //hash the password before saving user to database
   next()
})

嘿伙计们,我正在尝试理解猫鼬中中间件的概念。假设我有一个 userSchema,我在将用户保存到数据库之前运行 pre hook 以散列密码。从表面上看,据我了解,我拥有的上述代码将对密码进行哈希处理(不是这个问题的重要部分),然后调用 next() 来表示该功能已完成。但是,我试图了解事情在幕后是如何运作的。我想知道 next() 是什么?你们能否带我看一个例子,说明一旦代码被执行,一切如何从头到尾协同工作,或者以某种方式帮助我更好地理解这个概念?谢谢

4

1 回答 1

3

简短:使用该pre方法,您可以为模式的某些事件注册侦听器。pre('save', callback)每当您保存所述模型的文档时都会触发。pre意味着它将在事件之前执行,因此它可以用于(例如)在将密码保存到文档之前对其进行哈希处理。

但是,您有几个选项来定义它们,见下文:

不需要结合使用async回调函数和提供next参数,您可以:

使用带有下一个参数的正常回调

next参数是 mongoose 提供给您的一个函数,用于让您有出路,或者告诉 mongoose 您已完成并继续执行链中的下一步。也可以将一个传递Errornext它将停止执行链。

schema.pre('save', function(next) {
  // do stuff
  
  if (error) { return next(new Error("something went wrong"); }
  return next(null);
});

使用异步回调

一旦您的异步回调完成,执行链将在此处继续。如果出现错误并且您想中断/停止执行链,您就throw可以了

schema.pre('save', async function() {
  // do stuff
  await doStuff()
  await doMoreStuff()

  if (error) { throw new Error("something went wrong"); }
  return;
});

直接来自文档:https ://mongoosejs.com/docs/middleware.html#pre

例子

const { Schema, model }  = require('mongoose');

const SomeSchema = new Schema ({
  name : { type : String }
});

SomeSchema.pre('save', function (next) {
  console.log('pre save fired!');
  return next();
});

const Some = model('Some', SomeSchema);

console.log('before create');
const doc = new Some({ name : 'test' });
doc.save((err) => {
  console.log('after saved');
});

这将输出

before create
pre save fired!
after saved
于 2020-12-27T07:00:56.843 回答