简短:使用该pre
方法,您可以为模式的某些事件注册侦听器。pre('save', callback)
每当您保存所述模型的文档时都会触发。pre
意味着它将在事件之前执行,因此它可以用于(例如)在将密码保存到文档之前对其进行哈希处理。
但是,您有几个选项来定义它们,见下文:
不需要结合使用async
回调函数和提供next
参数,您可以:
使用带有下一个参数的正常回调
该next
参数是 mongoose 提供给您的一个函数,用于让您有出路,或者告诉 mongoose 您已完成并继续执行链中的下一步。也可以将一个传递Error
给next
它将停止执行链。
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