【问题标题】:Mongoose ODM: Can't save encoded password because of asyncMongoose ODM:由于异步,无法保存编码密码
【发布时间】:2012-07-18 07:41:14
【问题描述】:

我有一个问题,当文档已经持久化时,盐生成和密码编码已经准备好。 => mongoosejs 不会等到散列完成,所以我们在数据库中没有密码和盐(但我可以 console.log 它们:)。

有什么办法可以避免这种行为吗?

  1. 服务员功能?
  2. 或者我应该将编码部分移动到一些预保存中间件中?

编码方式

UserSchema.methods.encodePassword = function(password) {
    crypto.randomBytes(32, function(err, buf) {
        this.salt = buf.toString('hex');
        console.log(this.salt);
        crypto.pbkdf2(password, this.salt, 25000, 512, function(err, encodedPassword) {
            if (err) throw err;
            this.password = encodedPassword;
            console.log(this.password);
        }.bind(this));
    });
};

路由操作

// creates a new user
app.post('/users', function(req, res) {
    // create new user
    var user = new User();
    // assign post
    user.username = req.body.username;
    user.email = req.body.email;
    user.encodePassword(req.body.password);
    user.save(function(err, user) {
        console.log(user);
        if (!err) return res.send(err, 500);
        return res.json(user);
    });
});

【问题讨论】:

    标签: javascript node.js asynchronous mongoose


    【解决方案1】:

    您需要 encodePassword 进行回调,以便在完成后调用它。

    UserSchema.methods.encodePassword = function(password, callback) {
        crypto.randomBytes(32, function(err, buf) {
            this.salt = buf.toString('hex');
            console.log(this.salt);
            crypto.pbkdf2(password, this.salt, 25000, 512, function(err, encodedPassword) {
                if (err) return callback(err);
                this.password = encodedPassword;
                console.log(this.password);
                callback();
            }.bind(this));
        });
    };
    

    现在您可以等待它在您的路线中完成。

    app.post('/users', function(req, res) {
        // create new user
        var user = new User();
        // assign post
        user.username = req.body.username;
        user.email = req.body.email;
        user.encodePassword(req.body.password, function(err) {
            if(err) { /* handle error */ }
            user.save(function(err, user) {
                console.log(user);
                if (!err) return res.send(err, 500);
                return res.json(user);
            });
        });
    });
    

    【讨论】:

    • 嘿,由于某种原因,这仍然不起作用。我假设 UserSchema.methods.encodePassword 没有对模型的语义访问。我会看看这个
    • 我会在 mongoose google 群组中询问。文档是极简主义的方式。但是,我永远不知道何时以及如何通过设置器、方法、插件访问模型属性
    猜你喜欢
    • 2021-06-15
    • 2021-11-24
    • 1970-01-01
    • 2018-01-14
    • 2012-07-04
    • 2019-10-24
    • 1970-01-01
    • 2014-10-24
    • 2021-12-02
    相关资源
    最近更新 更多