Почему я получаю Promise Pending, несмотря на использование await в моем контроллере? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть хранилище, где я подключаюсь напрямую к своей модели для вставки некоторых данных, она успешно создает данные, но когда я подключаю свой контроллер к этому хранилищу, я получаю нулевой ответ, если я регистрирую его в самом хранилище, я получаю Обещание Пожалуйста, проверьте мой код ниже: -

Репозиторий. js

exports.register = (request) => {
  const data = UserModel.findOne({email: request.email})
    .then(user => {
        if(user)
        {
            return {status: 400, message: 'Email Already exist'}
        } else {
            return bcrypt.genSalt(10,  (err, salt) => {
                const newUser = new UserModel({
                    username: request.username,
                    email: request.email,
                    password: request.password
                });

                return bcrypt.hash(newUser.password, salt, async (err, hash) => {
                    if(err) throw err;
                    newUser.password = hash;
                    return newUser.save()
                        .then(user => {
                            const token = jwt.sign({id: user._id}, process.env.JWT_SECRET, {
                                expiresIn: 86400 // expires in 24 hours
                            });
                            return {status: 200, message: 'Successfully Registered', auth: true, token: token, user: user}
                        })
                        .catch(err => {
                            return {status: 400, message: err}
                        })
                })
            })
        }
})

  console.log(data) // This part is return Promise <pending>
  return data;
};

Контроллер. js

exports.SeedRegisteration = async (req, res, next) => {
  try {
    let element = await userRepo.register({username: "Testin", email: "Testin@test.com", "password": 
 "joe" });
      return await res.status(200).json({ status: 200, data: element })
 } catch (e) {
    return res.status(400).json({ status: 400, message: e.message });
 }
};

Работает нормально, но не возвращает данные

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Слишком много return утверждений, которые возвращают обещание. Пожалуйста, обновите ваш код до следующего:

    exports.register = (request) => {
    return new Promise((resolve, reject) => {
        try {
            UserModel.findOne({ email: request.email })
                .then(user => {
                    if (user) {
                        return reject({ status: 400, message: 'Email Already exist' })
                    } else {
                        bcrypt.genSalt(10, (err, salt) => {
                            const newUser = new UserModel({
                                username: request.username,
                                email: request.email,
                                password: request.password
                            });

                            bcrypt.hash(newUser.password, salt, async (err, hash) => {
                                if (err) return reject(err);
                                newUser.password = hash;
                                newUser.save()
                                    .then(user => {
                                        const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, {
                                            expiresIn: 86400 // expires in 24 hours
                                        });
                                        return resolve({ status: 200, message: 'Successfully Registered', auth: true, token: token, user: user })
                                    })
                                    .catch(err => {
                                        return reject({ status: 400, message: err })
                                    })
                            })
                        })
                    }
                }).catch(err => {
                    return reject(err)
                })
        } catch (error) {
            return reject(error)
        }
    });
};
0 голосов
/ 21 февраля 2020

Вот функция register, использующая версию Promise bcrypt (если вы не предоставите обратный вызов, функции bcrypt возвращают Promise

exports.register = (request) => 
    UserModel.findOne({
            email: request.email
    })
    .then(user => {
        if (user) {
            throw 'Email Already exist'
        }
    })
    .then(() => bcrypt.genSalt(10))
    .then(salt => {
        const newUser = new UserModel({
                username: request.username,
                email: request.email,
                password: request.password
            });

        return bcrypt.hash(newUser.password, salt)
        .then((hash) => {
            newUser.password = hash;
            return newUser.save();
        })
    }).then(user => {
        const token = jwt.sign({
            id: user._id
        }, process.env.JWT_SECRET, {
            expiresIn: 86400 // expires in 24 hours
        });
        return {
            status: 200,
            message: 'Successfully Registered',
            auth: true,
            token: token,
            user: user
        }
    }).catch(err => {
        return {
            status: 400,
            message: err
        }
    });

Примечание: есть ОДНО вложенное .then - this код мог бы быть совершенно плоским, если бы вы использовали async / await в register - однако я не был готов выполнить такую ​​большую переписку для ответа. Теперь, когда код находится в хорошей почти плоской цепочке обещаний, относительно просто преобразовать все это в асинхронном / ожидающем стиле

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