簡體   English   中英

盡管在我的控制器中使用了 await,為什么我仍然收到 Promise Pending?

[英]Why am I getting Promise Pending despite using await in my controller?

我有一個存儲庫,我直接連接到我的模型以插入一些數據,它成功創建了數據,但是當我將控制器連接到這個存儲庫時,我得到一個空響應,如果我將它登錄到存儲庫本身,我會得到 Promise 。 請在下面查看我的代碼:-

資源庫.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 });
 }
};

工作正常但不返回數據

這是使用 Promise 版本的 bcrypt 的register函數(如果您不提供回調,則 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 - 如果您在register使用 async/await,此代碼可能非常平坦 - 但是我不准備為答案執行如此大的重寫。 現在代碼處於一個漂亮的幾乎扁平的承諾鏈中,將整個事情轉換為 async/await 風格相對簡單

有太多返回承諾的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)
        }
    });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM