gpt4 book ai didi

mongodb - 使用 mongoose express 更新哈希密码

转载 作者:行者123 更新时间:2023-12-02 16:38:58 26 4
gpt4 key购买 nike

我已经回顾了很多关于这个问题的讨论,但似乎没有一个对我有帮助。

我正在使用 mongoose 5.5 来保存用户数据,如下所示:

我的架构如下所示:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const bcrypt = require("bcryptjs");

const userSchema = Schema({

userName: {
type: String
},
firstName: {
type: String
},
surName: {
type: String
},
password: {
type: String,
required: true
}
});

userSchema.pre('save', async function(next){

try {
if(!this.isModified('password')){
return next();
}
const hashed = await bcrypt.hash(this.password, 10);
this.password = hashed;

} catch (err) {
return next(err);
}
});

module.exports = user;

我的注册码是这样的:

exports.register = async (req, res, next) => {

try {
const user = await db.user.create(req.body);
const {id, username} = user;
res.status(201).json({user});

} catch (err) {
if(err.code === 11000){
err.message ='Sorry, details already taken';
}
next(err);
}
};

登录代码如下所示:

exports.login = async (req, res, next) => {

try {
const user = await db.user.findOne({username: req.body.username});
const valid = await user.comparePasswords(req.body.password);

if(valid){

const token = jwt.sign({id, username}, process.env.SECRET);
res.json({id, username, token});
}
else{
throw new Error();
}

} catch (err) {
err.message = 'Invalid username/password';
next(err);
}
};

注册和登录运行良好,我的挑战是更新密码。我想将当前密码与用户提供的密码(如登录时)进行比较,如果有效则更新新密码。

像这样:

exports.changepass = async (req, res, next) => {
const user = await db.user.findOne({username: req.body.username});
const valid = await user.comparePasswords(req.body.password);

if(valid){

" ?? update password and hash ?? "
}
else{
throw new Error();
}

}

最佳答案

如果您正在使用 findOneAndUpdate() 进行更新,请尝试使用 pre("findOneAndUpdate") 中间件修改密码,类似于您的 pre( “保存”)。每次使用 Model.findOndAndUpate() 更新模型时,都会调用 pre("findOneAndUpdate") 中间件。

你可以用 updateOne()pre("updateOne") 做同样的事情

示例:

// userSchema--------------------
...
userSchema.pre('save', async function (next) {
try {
if (!this.isModified('password')) {
return next();
}
const hashed = await bcrypt.hash(this.password, 10);
this.password = hashed;
} catch (err) {
return next(err);
}
});

userSchema.pre('findOneAndUpdate', async function (next) {
try {
if (this._update.password) {
const hashed = await bcrypt.hash(this._update.password, 10)
this._update.password = hashed;
}
next();
} catch (err) {
return next(err);
}
});

// changepass--------------------
...
if(valid){

//" ?? update password and hash ?? "
const result = await db.user.findOneAndUpdate(
{ username: req.body.username },
{ password: req.body.newPassword },
{ useFindAndModify: false }
);
}

关于mongodb - 使用 mongoose express 更新哈希密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62066921/

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