问题描述
我正在尝试通过 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"
}
的快照
数据库用户角色显示角色: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。