node.js - 密码散列不适用于 Put 请求
问题描述
使用 bcryptjs 库并在执行 Put 请求时遇到 2 个问题:
1- 在失眠/邮递员上,服务器返回散列密码,但在客户端检查控制台工具上返回“未散列”。
2- 我无法使用新密码凭证登录。
服务器代码上有任何明显的语法错误或快速建议吗?谢!
客户端代码:
function DevUpdateForm() {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [techs, setTechs] = useState("");
async function updateUser(e) {
e.preventDefault()
const dataUpdate = { name, email, password, techs}
const response = await api.put(`/devs/${dev._id}`, dataUpdate);
console.log(response);
setName('');
setEmail('');
setPassword('');
setTechs([]);
}
return (
<div className="update-profile">
<strong>Alterar</strong>
<img src={dev.avatar_url} alt={dev.name}/>
<form onSubmit={updateUser} >
<div className="input-block">
<label htmlFor="name">Nome:</label>
<input
name="name"
id="name"
type="text"
placeholder={"Alterar nome"}
value={name}
onChange={e => setName(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="email">E-mail:</label>
<input
name="email"
id="email"
type="text"
placeholder={"Alterar email"}
value={email}
onChange={e => setEmail(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="password">Senha:</label>
<input
name="password"
id="password"
type="password"
placeholder={"Digite nova senha"}
value={password}
onChange={e => setPassword(e.target.value)}
/>
</div>
<div className="input-block">
<label htmlFor="techs">Techs:</label>
<input
name="techs"
id="techs"
type="text"
placeholder={"Alterar tecnologias"}
value={techs}
onChange={e => setTechs(e.target.value)}
/>
</div>
<button type="submit" >Salvar</button>
</form>
</div>
)
}
export default DevUpdateForm;
服务器端更新控制器:
async update(req, res, next) {
try {
const { name, email, password, techs } = req.body;
const { _id } = req.params;
const techsArray = parseStringAsArray(techs);
let dev = await Dev.findByIdAndUpdate(_id, {
name,
email,
password,
techs: techsArray
},
{new: true});
dev = await Dev.findById(_id)
dev.password = await bcrypt.hash(dev.password, 8)
if (dev !== null) {
res.status(200).send({
data: dev,
message: "Dev has been updated!"
});
} else {
res.status(404).end();
}
} catch (error) {
next(error)
}
},
路线:
routes.put('/devs/:_id', DevController.allowIfLoggedin, DevController.grantAccess('updateAny', 'profile'), DevController.update);
解决方案
找到模型并为用户模型设置新值后。您必须执行.save()语句来更新现有更改。
async update(req, res, next) {
try {
const { name, email, password, techs } = req.body;
const { _id } = req.params;
const techsArray = parseStringAsArray(techs);
let dev = await Dev.findByIdAndUpdate(_id, {
name,
email,
password,
techs: techsArray
},
{new: true});
dev = await Dev.findById(_id)
dev.password = await bcrypt.hash(dev.password, 8)
dev.save();// add this to save new password
if (dev !== null) {
res.status(200).send({
data: dev,
message: "Dev has been updated!"
});
} else {
res.status(404).end();
}
} catch (error) {
next(error)
}
},
推荐阅读
- javascript - 消除由于不可预见的错误而导致的一组函数的不完整执行 (JavaScript)
- flutter - 未处理的异常:键入“列表”
' 不是类型 'Map 的子类型 - javascript - 如果语句忽略数字值
- amazon-quicksight - 如何获取特定用户拥有的 Amazon QuickSight 资源列表?
- php - 将 .htaccess 文件转换为 nginx
- r - 迭代 r 中列的行名
- data-structures - 在二叉树中,兄弟节点一定是有序的吗?
- python - Pandas pd.series 返回一个数据框
- html - 在从上到下排序的 2 列中显示 div
- php - 参数 1 传递给 Symfony\Component\VarDumper\Server\Connection::__construct() ... 在第 49 行的 DumpServerServiceProvider.php 中调用