#node.js #api #mongoose #ejs
#node.js #API #mongoose #ejs
Вопрос:
У меня есть приложение, использующее Node / Express / Mongo, и у меня возникают проблемы, когда я хочу отредактировать документ. Я могу добавлять документы без проблем, но когда я создал форму редактирования, я получаю ошибку в заголовке. Я также могу извлечь документ и просмотреть информацию, которую я ввел. Проблема в том, когда я пытаюсь сохранить все внесенные изменения.
Вот моя функция редактирования: ошибка возникает при brief.brief_title = updated_brief_title в методе findByIdAndUpdate.
exports.postEditBrief = (req, res, next) => {
const briefId = req.body.briefId;
const updated_brief_title = req.body.brief_title;
const updated_country = req.body.country;
const updated_psg = req.body.psg;
const updated_one_year_withholding = req.body.one_year_withholding;
const updated_withholding_only = req.body.withholding_only;
const updated_practice_advisory = req.body.practice_advisory;
const updated_courthouse = req.body.courthouse;
const updated_pages = req.body.pages;
const updated_additional_psg = req.body.additional_psg;
const updated_gangs = req.body.gangs;
const updated_gang_name = req.body.gang_name;
const updated_link = req.body.link;
Brief.findByIdAndUpdate(briefId)
.then(brief => {
brief.brief_title = updated_brief_title;
brief.country = updated_country;
brief.psg = updated_psg;
brief.one_year_withholding = updated_one_year_withholding;
brief.withholding_only = updated_withholding_only;
brief.practice_advisory = updated_practice_advisory;
brief.courthouse = updated_courthouse;
brief.pages = updated_pages;
brief.additional_psg = updated_additional_psg;
brief.gangs = updated_gangs;
brief.gang_name = updated_gang_name;
brief.link = updated_link;
return brief.save();
})
.then(result => {
console.log(Brief);
res.redirect('/');
})
.catch(err => console.log(err));
};
Я поиграл с различными методами «найти и обновить» в Mongoose, но результаты те же.
Ответ №1:
Вам нужно создать object
данные, которые вы хотите обновить, и передать их в качестве второго аргумента в функции, когда вы это сделаете, .then()
она выдаст вам результат выполняемой вами операции, и вам не нужно вызывать .save()
, поскольку она делает это внутренне
Правильная версия должна выглядеть примерно так
exports.postEditBrief = (req, res, next) => {
const briefId = req.body.briefId;
let update = {
brief_title: req.body.brief_title,
country: req.body.country,
psg: req.body.psg,
one_year_withholding: req.body.one_year_withholding,
withholding_only: req.body.withholding_only,
practice_advisory: req.body.practice_advisory,
courthouse: req.body.courthouse,
pages: req.body.pages,
additional_psg: req.body.additional_psg,
gangs: req.body.gangs,
gang_name: req.body.gang_name,
link: req.body.link
}
Brief.findByIdAndUpdate(briefId, update)
.then(result => {
console.log(result);
res.redirect('/');
})
.catch(err => console.log(err));
};
Вы можете упростить это еще больше, используя object destructuring
.
Обновить:
Вам нужно использовать $set
with findOneandUpdate
, если вы не хотите перезаписывать свой документ
exports.postEditBrief = (req, res, next) => {
const briefId = req.body.briefId;
let update = {
brief_title: req.body.brief_title,
country: req.body.country,
psg: req.body.psg,
one_year_withholding: req.body.one_year_withholding,
withholding_only: req.body.withholding_only,
practice_advisory: req.body.practice_advisory,
courthouse: req.body.courthouse,
pages: req.body.pages,
additional_psg: req.body.additional_psg,
gangs: req.body.gangs,
gang_name: req.body.gang_name,
link: req.body.link
}
Brief.findOneAndUpdate(briefId, {$set:update})
.then(result => {
console.log(result);
res.redirect('/');
})
.catch(err => console.log(err));
};
Комментарии:
1. Спасибо. Это работает лучше, но метод findByIdAndUpdate не сохраняется в базе данных. «Результат» в консоли равен null. findByOneAndUpdate сохраняет в базе данных, но перезаписывает идентификаторы, поэтому, как только я изменяю документ, он сбрасывает этот идентификатор в самый первый документ, который у меня есть, вместо изменения самого документа.