#node.js #mongodb #express #mongoose #mern
Вопрос:
Я следую учебнику в сети. Это проект MERN с монго/мангустом. Когда я реализовал функцию обновления в контроллере, произошла следующая ошибка :
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Я видел ответы о подобной проблеме, где говорится, что это связано с тем, что есть 2 или несколько вызовов res (res.json (), res.send() и т. Д.), Но я не вижу, где я должен изменить это в следующей функции :
module.exports.updateUser = async(req, res) =gt; { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " req.params.id); try { await UserModel.findOneAndUpdate({ _id: req.params.id }, { $set: { bio: req.body.bio } }, (err, docs) =gt; { if (!err) return res.send(docs); if (err) return res.status(500).send({ message: err }); } ) } catch (err) { return res.status(500).json({ message: err }); }
};
Ответ №1:
Возможно, вы перепутали два разных шаблона обработки ошибок.
Вам не нужно пытаться/ловить, если вы используете встроенную обработку ошибок findOneAndUpdate()
await UserModel.findOneAndUpdate({ _id: req.params.id }, { $set: { bio: req.body.bio } }, (err, docs) =gt; { if (!err) return res.send(docs); if (err) return res.status(500).send({ message: err }); } )
и если вы используете try/catch, вам не нужна обработка ошибок findOneAndUpdate:
try { const user = await UserModel.findOneAndUpdate({ _id: req.params.id }, { $set: { bio: req.body.bio } }) return res.send(user) } catch (err) { return res.status(500).json({ message: err }); }
Комментарии:
1. Большое вам спасибо за решение и объяснение. однако второй случай не работает ..
2. … для этого нужно вернуть res.отправить(документы); как в решении Мохсина.
3. А, хорошая мысль. Я обновлю ответ. Спасибо!
Ответ №2:
Не могли бы вы, пожалуйста, изменить код вот так:
module.exports.updateUser = async(req, res) =gt; { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " req.params.id); try { const result = await UserModel.findOneAndUpdate({ _id: req.params.id }, { $set: { bio: req.body.bio } }); return res.send(result); } catch (err) { return res.status(500).json({ message: err }); } };
Комментарии:
1. Огромное спасибо. теперь это работает