Я пытаюсь в своем API NodeJS и Mon goose добавить маршрут для PUT / UPDATE записей вложенного документа. У меня есть профили, которые содержат опыт, и моя цель - обновить один опыт для одного профиля. Это маршрут:
experienceRouter.put("/:username/experience/:expId", async (req, res) => {
try {
// const experienceToEdit = await Profiles.findOne(
// { "experience._id": req.params.expId },
// { _id: 0, "experience.$": 1 },
// { $set: { ...req.body } }
// );
const experienceToEdit = await Profiles.findOneAndUpdate(
{
username: req.params.username
},
{
experience: req.params.expId
},
{ "experience.$": 1, username: 1, _id: 0 },
{ $set: { ...req.body } }
).lean();
if (experienceToEdit)
res.send({ Message: "Update", experience: req.body });
res.status(404).send("Not found");
} catch (err) {
res.status(500).send(err);
}
});
Сначала я должен сопоставить имя пользователя, затем найти expId и обновить его. Я отправляю поля как req.body
Пример запроса:
"experience": {
"_id": "5e26ff6d5be84a3aeeb2f7bc",
"title": "Senior Dev",
"role": "Dev",
"company": "ArosaDev",
"startDate": "2018-12-03T23:00:00.000Z",
"endDate": null,
"description": "",
"area": "",
}
С кодом, который я отправил, я получаю понедельник goose ошибка:
{
"message": "Callback must be a function, got [object Object]",
"name": "MongooseError"
}
Я не знаю, как включить имя пользователя в уравнение, если я обойдусь без этого:
const experienceToEdit = await Profiles.findOne(
{ "experience._id": req.params.expId },
{ _id: 0, "experience.$": 1 },
{ $set: { ...req.body } }
);
Это работает, но мне не хватает параметра имени пользователя, и мне нужно понять, как пройти мимо.