gpt4 book ai didi

mongodb - Mongoose 中间件如何工作以及什么是 next()?

转载 作者:行者123 更新时间:2023-12-05 03:46:05 26 4
gpt4 key购买 nike

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

大家好,我想了解 mongoose 中中间件的概念。假设我有一个 userSchema,我在将用户保存到数据库之前运行 pre hook 来散列密码。从表面上看,据我所知,上面的代码将对密码进行哈希处理(不是这个问题的重要部分),然后调用 next() 来表示函数已完成。但是,我试图了解引擎盖下的工作原理。我想知道什么是 next() ?你们能给我举个例子,说明一旦代码执行后,一切如何从头到尾一起工作,或者以某种方式帮助我更好地理解这个概念吗?谢谢

最佳答案

简而言之:使用 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 it

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

关于mongodb - Mongoose 中间件如何工作以及什么是 next()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65463458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com