функция promise в узле не может получить возвращаемое значение

#javascript #node.js #express #promise #async-await

#javascript #node.js #выразить #обещание #асинхронный -ожидание

Вопрос:

Я пытаюсь получить возвращаемое значение из функции ниже, но не могу, потому что возвращаемое значение выполняется до того, как возвращается результат.

Может ли кто-нибудь указать мне правильное направление?

 exports.addUser = async (data) => {

  const updateduser = await db.User.findOne({
    where: {
      email: data.email,
    },
  }).then(user => {
    if (user) {
      return null
    } else {
      bcrypt.hash(data.password, 10).then(
        hashedPassword => {
          const newUser = {
            firstName: data.firstName,
            lastName: data.lastName,
            email: data.email,
            password: hashedPassword
          }
          db.User.create(newUser).then(insertedUser => {
            return insertedUser
          })
        }
      )
    }
  });

  return updateduser
}
  

Контроллер, где ответ должен основываться на возвращаемом значении из функций addUser выше..

 exports.signUp = async (req, res, next) => {
  const userData = {
    firstName: req.body.firstName,
    lastName: req.body.lastName,
    email: req.body.email,
    password: req.body.password,
  };

  const {
    error
  } = signUpValidation(userData);
  if (error) return res.status(400).json({
    message: error.details[0].message
  });
  try {
    const user = await addUser(userData);
    if (!user) {
      res
        .status(403)
        .json({
          message: "This email is already exits, Please login 🔁 "
        });
    } else {
      res.status(200).json({
        id: user.id,
        email: user.email,
        status: true,
        message: " You're now registered!✅Please check your Email!✅  ",
      });
    }
  } catch (error) {
    next(error);
  }
}
  

Комментарии:

1. С какой функцией у вас возникли проблемы addUser или signUp ?

2. Попробуйте последовательно использовать await вместо того, чтобы смешивать его с .then() .

3. оберните новое обещание, разрешите значение вместо возврата

4. Вы должны вернуть bcrypt обещание так же, как db.User.create и обещание

5. я думаю insertedUser , что никогда не возвращался… это обратный вызов внутри обратного вызова .. попробуйте поставить return перед каждым обещанием, которое вы выполняете ().then ..

Ответ №1:

Затем вы смешиваете асинхронные / await и вложенные вызовы then до такой степени, что становится действительно сложно следовать вашему коду. Вы всегда должны стараться придерживаться либо async / await, либо then (хотя есть несколько исключений). Также старайтесь избегать вложенности, когда это возможно. Ваш код можно упростить до следующего:

 exports.addUser = async (data) => {
  const user = await db.User.findOne({
    where: {
      email: data.email,
    },
  });
  if (user) {
    return null;
  }
  const hashedPassword = await bcrypt.hash(data.password, 10);
  const newUser = {
    firstName: data.firstName,
    lastName: data.lastName,
    email: data.email,
    password: hashedPassword,
  };
  return db.User.create(newUser);
};
  

Вероятно, вам следует прочитать немного больше о await.

Обратите внимание, что основная проблема в вашем коде заключается в том, что вы возвращаете что-то во вложенном обратном вызове then. Но вы не возвращаете ни внутреннее, ни внешнее, а затем блокируете себя.

Комментарии:

1. Отметил, что я немного смущен, я знаю, что значения доступны в блоке кода, мне трудно перемещать значения между блоками по порядку