Запись обновляется, но я все еще получаю эту ошибку в консоли

Итак, я пытаюсь обновить существующие записи в MongoDB, и обновление записей отображается правильно, но в консоли я все еще вижу эти предупреждения и ошибки:

{"name":"Bruce","number":"22222","date":"2020-12-18T20:08:45.446Z","id":"5fdd0c4d72a07e5d0c63c056"}
****  { _id: 5fdd0c4d72a07e5d0c63c056,
  name: 'Bruce',
  number: '22222',
  date: 2020-12-19T06:29:29.022Z,
  __v: 0 }
// ^------- this is the record body sent from the frontend and it's being updated correctly.

// but I still get this following  errors:

error:  Error [ERR_HTTP_HEADERS_SENT]
PUT /api/persons/5fdd0c4d72a07e5d0c63c056 402 99 - 116.533 ms {"name":"Bruce","number":"22222","date":"2020-12-18T20:08:45.446Z","id":"5fdd0c4d72a07e5d0c63c056"}
(node:8288) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: 
Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (E:\fsopen_revision\phonebook\server\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (E:\fsopen_revision\phonebook\server\node_modules\express\lib\response.js:170:12)
    at Contact.findByIdAndUpdate.then.catch (E:\fsopen_revision\phonebook\server\index.js:136:11)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:8288) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a 
catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)

Код используется для выполнения обновления:


app.put("/api/persons/:id", (req, res) => {
  console.info(JSON.stringify(req.body));
  const id = Object(req.params.id);
  const body = req.body;

  const newPerson = {
    name: body.name,
    number: body.number,
    date: new Date(),
  };

  Contact.findByIdAndUpdate(id, newPerson, {
    new: true,
  })
    .then((updatedContact) => {
      console.info("**** ", updatedContact);
      return res.json(updatedContact).send({ message: "Updated" });
    })
    .catch((e) => {
      console.info("error: ", e.name);
      res.send(402).json({ name: e.name });
    });
});

Фронтенд работает нормально и данные тоже корректно обновляются:

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте этот синтаксис, сначала проверьте, существует ли идентификатор пользователя в БД, затем findByIdAndUpdate с обработкой ошибок и ответов:

    updateUser: (req, res) => {
            
            const id = Object(req.params.id);
            const body = req.body;

            const newPerson = {
                name: body.name,
                number: body.number,
                date: new Date(),
            };

            Contact.findById(id, (err, res) => {
                if (err) return res.status(500).send({message: 'Error finding user'});        
            });      
            
            User.findByIdAndUpdate(id, newPerson, {new: true}, (err, updatedContact) => {
                if (err) return res.status(500).send({message: 'Error updating'});
                if (!userUpdated) return res.status(404).send({message: 'user doesnt exists'});
                return res.status(200).send(contact: updatedContact);
            });
    }
Ответ принят как подходящий

Ваше сообщение об ошибке гласит: Cannot set headers after they are sent to the client

Вы не можете отправить ответ два раза. Либо используйте метод json(), либо метод send(). Каждый из них создает заголовки для ответа, отправляет тело (полезную нагрузку) и затем завершает отправку ответа с сервера.

// incorrect use of express api
res.json(updatedContact).send({ message: "Updated" });

// change to
res.json({ message: "Updated", contact: updatedContact });

Другие вопросы по теме