首页 文章

Mongoose ODM:由于异步,无法保存编码密码

提问于
浏览
1

我有一个问题,当文件已经持久化时,盐生成和密码编码已准备就绪 . => mongoosejs不会等到哈希结束,所以我们在数据库中没有密码和盐(但我可以在console.log中:) .

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

  • 服务员功能?

  • 或者我应该将编码部分移动到一些预先保存的中间件中?

encoding method

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));
    });
};

route action

// 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);
    });
});

1 回答

  • 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);
            });
        });
    });
    

相关问题