#javascript #node.js #express #mongoose
#javascript #node.js #экспресс #mongoose
Вопрос:
На стороне клиента пользователь может обновить свой профиль через форму, в которой данные отправляются через axios на серверную часть nodejs express. Я хочу использовать mongoose для обновления информации о пользователе. Вот что я пробовал:
userRouter.post('/update/:username', (req, res) => {
const update = {age: req.body.age, height: req.body.height, weight: req.body.weight, gender: req.body.gender}
const filter = {username: req.params.username}
User.findOneAndUpdate(filter, update, { new: true });
});
Комментарии:
1. В чем проблема?
2. В базе данных ничего не обновляется, и консоль сообщает, что запрос POST не удался.
3. Попробуйте
User.findOneAndUpdate(filter, update, { new: true }, (err, doc) => {...})
4. ах, это сработало! Не могли бы вы объяснить, почему?
5. Вы можете прочитать об этом здесь: mongoosejs.com/docs/queries.html#executing
Ответ №1:
findOneAndUpdate
метод User
возвращает обещание и другой вариант, в котором он принимает обратный вызов. Вы не передали ничего, что вызвало эту ошибку. Вы можете попробовать подход обратного вызова или тот, который написан ниже.
userRouter.post('/update/:username', async (req, res) => {
const update = {age: req.body.age, height: req.body.height, weight: req.body.weight, gender: req.body.gender}
const filter = {username: req.params.username}
const updatedDocument = await User.findOneAndUpdate(filter, update, { new: true });
return res.status(200).send(updatedDocument);
});
Ответ №2:
В спецификации REST API при обновлении некоторых ресурсов на сервере вы должны использовать метод PATCH
or PUT
для запроса.
Вы используете POST
метод.
Здесь вы можете сделать это так
Сначала получите имя пользователя и выполните поиск в базе данных, используя свойство filter. Теперь получите req.body
и примените обновленные данные
app.patch('/update/:username', (req, res) => {
//You can pass req.body directly or you can separate object
const { age, height, weight, gender } = req.body;
const { username } = req.params;
const filter = { username : username }
const updatedUser = await User.findOneAndUpdate(filter, req.body, { new: true }).catch(error => {
return res.status(500).send(error);
});
return res.status(200).json({
message : "Updated user",
data: updatedUser
});
});
Ответ №3:
Это работает для меня, сначала создайте схему, а затем импортируйте ее в свой файл.
import RegisterSchemaModel from '../schema/RegisterSchema.js';
router.post("/api/admin/epadmin",(req, res) => {
const uData = {
"name": req.body.name,
"lname": req.body.lname,
"mobile": req.body.mobile,
"address":req.body.adddress,
"city":req.body.city,
"gender":req.body.gender
}; // Data to be Updated
const cData = { "email": req.body.email }; // Conditional Data or Unqiue Key to fetch
const updatedUser = RegisterSchemaModel.findOneAndUpdate(cData, uData,{new:true}).then((result) => {
return res.send(result)
}).catch(error => {
return res.status(500).send(error);
});
return res.status(200).json({
message : "Updated user",
data: updatedUser
});
});