更新:为什么在 mongodb 中编辑后用户角色没有改变?

问题描述

我正在尝试通过 nodejs/expressjs 和 mongodb 制作一个身份验证用户部分,其中用户将具有不同的角色,并且用户的参数将保存在 mongodb 中。在为每个用户登录的情况下,他们将认保存为“用户”。编辑后,它的角色会变成管理员或版主,这个角色变化也会在 mongodb 中更新。

这是我在 node.js/Express.js 中的用户架构:

location /static {
        root /home/ubuntu/myproject/app/static/;
    }

这里是用于编辑和更新角色的router.put:

 const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,required: true,},email: {
    type: String,unique: true,password: {
    type: String,minlength: 8,displayName: {
    
    type: String,role: {
    type: String,enum: ['user','moderator','admin'],default: 'user',resetLink: {
    data: String,default: "",});

module.exports=User=mongoose.model("user",userSchema) 

我正在使用邮递员检查代码。编辑的 url 是 http://localhost:5000/users/admin/newrole,其中 admin 是将要更改角色的用户用户名。在帖子的正文行中,我提供如下输入:

    router.put("/:username/newrole",async(req,res)=>{
  
let role,username;

try {
  username = req.params.username;
  
   console.log(username);

  
  
const result = await User.updateOne(
  { username: req.body.username },{ $set: { role: req.body.role } }
);  

  console.log("result = ",result);

  res.status(200).json({ msg: "User role has been updated successfully!" });
} catch(e) {
  if (User == null) {
    console.log(e)
    res.status(400).json({ msg: "no such username found!" });
  } else {
    User: User,console.log(e);
    res.status(405).json({ msg: "Error updating!" });
  }
}
 
})

输出显示成功的用户角色已更改但console.log(result):

{
"role":"user"
} 

这是

of my db where user role is not changing

的快照

数据库用户角色显示角色:null,假设要更改为“用户”。我哪里出错了?

请告诉我

解决方法

当您执行 user.updateOne({role: req.body.role}); 时,响应不是用户更新,而是类似于 { ok: 0,n: 0,nModified: 0 }

所以你做 user.save(); 的下一行不是预期的行为。

您可以只调用一次,而不是使用三个 DB 调用:

await user.findOneAndUpdate({ username: username },{$set:{role: req.body.role}})

您在这里所做的是:对于 username 等于 - 从 req.body.username 加载的您的用户名的文档 - 然后将值 role 设置为 req.body.role .

,

终于解决了。这是更新角色的以下代码:

router.patch('/:id/update',async(req,res)=>{
 
try {
 const user=await User.updateOne({_id:req.params.id},{$set:{role:req.body.role}},{
    new:true
  })
  console.log(req.body.role); 
} catch (e) {
  console.log(e)
}
})

在邮递员中,我不得不使用 x-www-form-urlencoded ,其中我选择了键作为角色,值是管理员或用户或我想要的任何枚举。并且请求 url 必须包含 _id 号,因为我已经过滤了它,这将是一个补丁请求。

成功了。

但是感谢 J.F. 的帮助。您的聊天帮助我了解了 mongoose 和 mongodb 命令以及处理路由的 nodejs/expressjs。