gpt4 book ai didi

javascript - Mongoose ODM : Can't save encoded password because of async

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:49 25 4
gpt4 key购买 nike

我遇到的问题是,当文档已经持久化时,盐生成和密码编码就已准备就绪。 => 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);
});
});

最佳答案

您需要 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));
});
};

现在您可以等待它在您的 route 完成。

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

关于javascript - Mongoose ODM : Can't save encoded password because of async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11555464/

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