#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, обрабатывающие маршрут.