【问题标题】:How do I get the updated document back after I call document.save() function in mongoose?在猫鼬中调用 document.save() 函数后,如何取回更新的文档?
【发布时间】:2020-09-14 11:20:12
【问题描述】:

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

服务器代码(node.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 而无需用户注销并再次登录?

【问题讨论】:

    标签: node.js mongodb mongoose jwt


    【解决方案1】:

    调用 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,
     });
    

    }

    【讨论】:

    • 我明白了,他们是否可以自动执行此操作?例如,假设您的模型非常复杂,并且每个字段都有一定的限制。那你会怎么处理这样的事情呢?
    • 我认为最好还是为每个案例编写自己的验证。如果你坚持使用 mongoose 的内置验证来为你做这件事,我想你可以在技术上做另一个查询来在 save() 之后获取用户文档,因为如果 save() 失败,那不会改变.
    • 感谢您的帮助 :) 非常感谢!
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2021-03-11
    • 2017-05-26
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多