#mongodb #express #mongoose
#mongodb #выразить #mongoose
Вопрос:
Отправка запроса put с помощью findAndUpdateById, который возвращает 200 ответов в postman — но данные не обновляются.
Запрос put является
app.put("/api/report/update/:id", (req, res) => {
Report.findByIdAndUpdate(
req.params.id,
req.body.data,
{ new: true },
(err, report) => {
if (err) return res.status(404).send({ message: err.message });
return res.send({ message: "report updated!", report });
}
);
});
Форма отправляемых данных такова
report: {
month: "",
updateMajor: "",
updateMinor: "",
comments: {
comment1: "",
comment2: "",
comment3: ""
},
}
Данные возвращаются точно в том виде, в каком они были отправлены.
Спасибо за любую помощь.
Комментарии:
1. Проверьте содержимое в
req.body
с помощьюconsole.log(req.body)
, скорее всего, оно содержит не то, что вы ожидаете.
Ответ №1:
вам нужно использовать какой-нибудь update
оператор, такой как $set
, $unset
, $push
и т.д. в вашем запросе на обновление. поскольку вы не используете ни один из них, вы получаете такое поведение.
Если вы просто хотите установить значение, которое вы отправляете, попробуйте использовать его с $set
.
Попробуйте это:
Report.findByIdAndUpdate(
req.params.id,
{$set : req.body.data } ,
{ new: true },
(err, report) => {
if (err) return res.status(404).send({ message: err.message });
return res.send({ message: "report updated!", report });
}
);
Примечание: $set переопределяет предыдущее значение.
Если вам нужно что-то еще, пожалуйста, ознакомьтесь с подробной информацией в Документации операторов обновления MongoDB
Комментарии:
1. На самом деле использование mongoose (как и вопрос на самом деле)
$set
подразумевается и автоматически добавляется к фактическому заявлению, отправленному в MongoDB. Вы можете увидеть это с помощьюmongoose.set('debug', true)
. Так что нет, проблема не в этом.2. $ set сработал, мне также пришлось отправлять по каждому полю и значению вместо body.data