在猫鼬中调用 document.save() 函数后如何取回更新的文档?



>我正在尝试创建一个设置页面,用户可以在其中更新其凭据(用户名等( 用户名的长度为 5<长度>

服务器代码(节点.js(

/* ................ 
code to update other fields
...............*/
if (newUsername && newUsername !== user.username) {
user.username = newUsername;
messages.push({
message: 'Username updated successfuly',
error: false,
});
}
await user.save({ j: true }, (err) => {
if (err) {
messages.push({ message: err.message, error: true });
}
res.clearCookie(accessTokenName);
createJWTCookie(user, res);
res.render('settings', { messages });
});

但是,这并不像我想要的那样工作。内置验证确实会启动并防止保存无效字段,但令牌仍然会更新错误的信息。我相信这是因为createJWTCookie的(用户(参数仍然包含运行user.save()方法之前的信息。

即使我在运行user.save()方法后console.log(user),它也包含来自用户的无效输入。但是,如果我注销并再次登录(这会与数据库中的用户一起创建一个新的 JWT Cookie(,则生成的令牌仅具有有效字段。这意味着仅更新了有效字段,而放弃了其他更改。

如何在运行user.save()后获取更新的用户文档,以便我可以创建有效的 JWT cookie,而无需用户注销并再次登录?

调用 user.save(( 不会对用户对象进行任何更改,它只会更新数据库上的文档。如果内置验证由于用户名无效而启动,它将阻止 save(( 发生(这很好作为故障保护(,但不会影响代码中的实际用户对象。

要解决此问题,您需要在更新用户对象时编写自己的验证。这应该有效:

if (newUsername && newUsername !== user.username && newUsername.length > 5 && newUserName.length < 30) {
user.username = newUsername;
messages.push({
message: 'Username updated successfuly',
error: false,
});

}

最新更新