как я могу решить эту проблему у меня с findOneAndUpdate - PullRequest
0 голосов
/ 22 октября 2019

Попытка обновить mongodb doc с использованием findOneAndUpdate метода

Попытка поиска документа различными способами и переформатирование обновления по-разному

router.put(
  "/edit",
  [
    auth,
    [
      check("name", "Name is required")
        .not()
        .isEmpty(),
      check("email", "Please enter a valid email").isEmail(),
      check(
        "password",
        "Please enter a password with 8 or more characters"
      ).isLength({ min: 8 })
    ]
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      res.status(404).json({ errors: errors.array() });
    }

    const { email, password, name } = req.body;

    const update = {
      email,
      password,
      name
     };

    const salt = bcrypt.genSalt(10);

    update.password = bcrypt.hash(password, salt);

    try {
      const user = await User.findOneAndUpdate(
        { user: req.user.id },
        { $set: update },
        { new: true, upsert: true }
      );
      res.json(user);
    } catch (err) {
      console.error(err);
      res.status(500).send("Server Error");
    }
  }
);

Я хочу вернуть обновленноепользователь, но я продолжаю ловить ошибку и возвращаю 500.

1 Ответ

3 голосов
/ 22 октября 2019

bcrypt.genSalt и методы хэширования возвращают обещание, поэтому вам нужно дождаться.

Также я изменил на findOneAndUpdate на findByIdAndUpdate, который, на мой взгляд, более понятен в этом случае.

Можете ли вы попробовать сэтот код?

router.put(
  "/edit",
  [
    auth,
    [
      check("name", "Name is required")
        .not()
        .isEmpty(),
      check("email", "Please enter a valid email").isEmail(),
      check(
        "password",
        "Please enter a password with 8 or more characters"
      ).isLength({ min: 8 })
    ]
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      res.status(404).json({ errors: errors.array() });
    }

    const { email, password, name } = req.body;

    const update = {
      email,
      password,
      name
    };

    const salt = await bcrypt.genSalt(10);

    update.password = await bcrypt.hash(password, salt);

    try {
      const user = await User.findByIdAndUpdate(req.user.id, update, {
        new: true,
        upsert: true
      });
      res.json(user);
    } catch (err) {
      console.error(err);
      res.status(500).send("Server Error");
    }
  }
);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...