Mongoose 模块 (NodeJS) 中的 Schema.pre

Posted

技术标签:

【中文标题】Mongoose 模块 (NodeJS) 中的 Schema.pre【英文标题】:Schema.pre in Mongoose modules (NodeJS) 【发布时间】:2016-06-27 16:20:24 【问题描述】:

我开始使用 NodeJS,我目前正在编写我在互联网上找到的一个很好的教程来管理身份验证: https://devdactic.com/restful-api-user-authentication-1/

有一段代码我不太明白,我在互联网上也找不到进一步的解释,甚至在模块的官方页面上也找不到......

UserSchema.pre('save', function (next) 
    var user = this;
    if (this.isModified('password') || this.isNew) 
    
        bcrypt.genSalt(10, function (err, salt) 
               
            if (err) 
            
                return next(err);
            
            bcrypt.hash(user.password, salt, function (err, hash) 
                if (err) 
                    return next(err);
                
                user.password = hash;
                next();
            );
        );
     
    else 
    
        return next();
    
);

在这段代码中,什么是“pre”,我认为他们称之为钩子,但我不明白它的含义。之后还有一个回调函数作为参数“next”,但我认为回调函数中的第一个参数总是“错误”。 如果有人可以对那段代码有所了解,我将不胜感激...在此先感谢

【问题讨论】:

【参考方案1】:

这是一个中间件函数,在项目保存到数据库之前直接调用(因此名称为 pre)。这使得在保存对象之前直接执行函数成为可能。很多时候它被用来转换一个值。

在这种情况下,在保存对象之前,它会对密码进行哈希处理并保存该哈希密码而不是纯文本版本。

next() 是您在完成函数时调用的回调。您可以在该回调中传递一个错误,如果您这样做,第一个错误处理中间件将处理该函数,因此您的项目不会被保存到数据库中。

您可以找到更多信息in the docs ofMongoose。

【讨论】:

以上是关于Mongoose 模块 (NodeJS) 中的 Schema.pre的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中使用mongoose保存数据

nodejs中使用mongoose保存数据

MongoDB / Mongoose / nodejs 中的引用 - 并行化

mongoose中connect()createConnection()和connection的区别和作用

Nodejs+Express学习二(Mongoose基础了解)

无法得到我在 nodejs / mongoose / bluebird 中返回的承诺