ОШИБКА HTTP_HEADERS_SENT: экспресс, сбой сервера Mongoose

#node.js #express #authentication #mongoose

#node.js #экспресс #аутентификация #mongoose

Вопрос:

Я работаю над серверной частью аутентификации пользователя с помощью express amp; mongoose.

Я пытаюсь разобраться в возможности пользователей обновлять свое имя и адрес электронной почты.

Итак, я проверяю, совпадает ли электронное письмо с электронной почтой текущего пользователя, а затем, если нет, проверяю, соответствует ли оно электронной почте любого другого пользователя. Если это произойдет, я выдам ошибку, если нет, я сохраняю ее для пользователя.

Имя обновляется нормально, а электронная почта обновляется нормально (за исключением случаев, когда пользователь уже был вызван).

Сообщение об ошибке отправляется клиенту, но также приводит к сбою сервера с помощью «ERR_HTTP_HEADERS_SENT», и я ни за что на свете не могу понять, почему, поскольку я возвращаю ошибку.

Вот код:

 exports.update = (req, res) => {
  // Get New User Details
  const { firstName, lastName, email } = req.body;

  // Find User
  User.findById(req.user._id, (err, user) => {
    if (err || !user) {
      return res.status(400).json({
        error: 'User not found.'
      });
    }
    user.firstName = firstName;
    user.lastName = lastName;

    // Check to see if another user has this email.
    if (email !== user.email) {
      User.findOne({ email: email }).exec((err, existingUser) => {

        // If they do, send an error message.
        if (!err amp;amp; existingUser) {
          return res.status(400).json({
            error: "This email address is already in use.",
          });
        }

        // If they don't, send alert email to old email address.

      });

      // Finally update email address.
      user.email = email;
    }

    // Save Updated User Information
    user.save((err, updatedUser) => {
      if (err) {
        console.log("Error: Could not update user.");
        return res.status(400).json({
          error: 'User update failed.'
        });
      }
      updatedUser.hashedPassword = undefined;
      updatedUser.salt = undefined;
      return res.json({
        message: ' Account updated successfully.',
        data: updatedUser
      });
    });
  });
};  

Ответ №1:

Удалось решить:

 // Update User Account Data
// ========================
exports.update = (req, res) => {
  // Get New User Details
  const { firstName, lastName, email } = req.body;

  // Find User
  User.findById(req.user._id, (err, user) => {
    if (err || !user) {
      return res.status(400).json({
        error: 'User not found.'
      });
    }

    if (email !== user.email) {
      User.findOne({ email: email }).exec((err, existingUser) => {

        // If they do, send an error message.
        if (!err amp;amp; existingUser) {
          return res.status(400).json({
            error: "This email address is already in use.",
          });
        }

        // If they don't, send alert email to old email address.

        // Finally update user.
        user.firstName = firstName;
        user.lastName = lastName;
        user.email = email;

        // Save Updated User Information
        user.save((err, updatedUser) => {
          if (err) {
            console.log("Error: Could not update user.");
            return res.status(400).json({
              error: 'User update failed.'
            });
          }
          updatedUser.hashedPassword = undefined;
          updatedUser.salt = undefined;
          return res.json({
            message: ' Account updated successfully.',
            data: updatedUser
          });
        });

      });
    } else {
      user.firstName = firstName;
      user.lastName = lastName;

      // Save Updated User Information
      user.save((err, updatedUser) => {
        if (err) {
          console.log("Error: Could not update user.");
          return res.status(400).json({
            error: 'User update failed.'
          });
        }
        updatedUser.hashedPassword = undefined;
        updatedUser.salt = undefined;
        return res.json({
          message: ' Account updated successfully.',
          data: updatedUser
        });
      });
    }
  });
};