Не видно, где несколько вызовов res вызвали ошибку : Не удается установить заголовки после их отправки клиенту

#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. Огромное спасибо. теперь это работает