ОБНОВЛЕНИЕ: почему роль пользователя не меняется после редактирования в mongodb?

#node.js #mongodb #express #node-modules #nodejs-server

#node.js #mongodb #экспресс #узлы-модули #nodejs-сервер

Вопрос:

я пытаюсь создать пользовательскую часть аутентификации с помощью nodejs / expressjs с mongodb, где пользователи будут иметь разные роли, а параметры пользователей будут сохранены в mongodb. в случае входа в систему для каждого пользователя они будут сохранены как «user» по умолчанию. после редактирования его роль изменится на администратора или модератора, и это изменение роли также будет обновлено в mongodb.

вот моя схема пользователя в node.js/Express.js:

  const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
    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) 
 

вот router.put для редактирования и обновления роли:

     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!" });
  }
}
 
})
 

я использую postman для проверки кода. URL-адрес для редактирования http://localhost:5000/users/admin/newrole где admin — это имя пользователя, роль которого будет изменена. и в строке тела сообщения я даю ввод, как показано ниже:

 {
"role":"user"
} 
 

но вывод показывает, что роль пользователя успешно изменилась, но console.log (результат):

 result =  {
  n: 0,
  nModified: 0,
  opTime: {
    ts: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1611010685 },
    t: 7
  },
  electionId: 7fffffff0000000000000007,
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1611010685 },
    signature: { hash: [Binary], keyId: [Long] }
  },
  operationTime: Timestamp { _bsontype: 'Timestamp', low_: 2, high_: 1611010685 }
}

 
 

и вот снимок моей БД, где роль пользователя не меняется

в роли пользователя базы данных отображается role: null, которая, как предполагается, меняется на «user». где я допустил ошибку?

пожалуйста, дайте мне знать

Ответ №1:

Когда вы это делаете 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 .

Комментарии:

1. вывод по-прежнему показывает то же самое: { «msg»: «такое имя пользователя не найдено!» } я добавляю снимок своей базы данных, чтобы можно было понять, как сохраняются пользователи

2. Не существует пользователя с этим именем пользователя

3. но перед строкой этого сообщения об ошибке res.status(400) console.log(имя пользователя) отображается undefined, а console.log (роль) также отображается undefined

4. попробуйте { username = req.body.username; //await user.save(); await user.findOneAndUpdate( { username: username }, { $set: { role: req.body.role } } ); console.log(роль) //user.save();console.log(роль); res.status(200).json({ сообщение: «Роль пользователя была успешно обновлена!» }); } : это код после предложения ur. похоже, что в try / catch try не может найти имя пользователя, которое я даю. я искал slug в nodejs, написано, что в этом нет необходимости. итак, перенаправление имени пользователя — хорошая идея или я должен искать user _id?

5. Перехватите исключение и сделайте console.log(e) , чтобы узнать, в чем ошибка.

Ответ №2:

наконец-то решил эту проблему. вот следующий код для обновления роли:

 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)
}
})
 

в postman мне пришлось использовать x-www-form-urlencoded, где я выбрал ключ в качестве роли, а значение — admin или user или что я хочу в соответствии с enum. и URL-адрес запроса должен содержать номер _id, который я отфильтровал по нему, и это будет запрос на исправление.

это сделало свое дело.

но спасибо Дж.Ф. за помощь. ваш чат помог мне понять команды mongoose и mongodb, а также nodejs / expressjs, обрабатывающие маршрут.