在Node.js中的异步等待函数后返回响应

时间:2018-10-27 06:15:22

标签: javascript node.js asynchronous promise async-await

我正在开发一个小型应用程序,我有问题。在等待从Mongodb运行查询之后,我使用map方法执行了一些任务,然后返回了响应,但是响应始终返回promise,并且我没有必要的数据。这是我的代码

    exports.getListChallenges = async function (req, res) {
    var status_code = Consts.STATUS_CODE.ERROR.UNKOWN_ERROR;
    try {
        var page_number = parseInt(req.params.page_number);
        var page_size = parseInt(req.params.page_size);
        var challenges = await Challenge.find()
            .skip(page_size * (page_number - 1))
            .limit(page_size);            
        status_code = Consts.STATUS_CODE.SUCCESS.DATA_FOUND;

        challenges = challenges.map(async function (o) {
            var challenger_club = await Club.findById(o.challenger_club_id);
            var challege = {
                challenge: o,
                challenger_club_name: challenger_club.club_name,
                challenger_club_avatar: challenger_club.avatar
            };
            return challege;
        });

        res.json({
            "status": true,
            "message": "Challenges found !",
            "status_code": status_code,
            "challenges": challenges
        });

    } catch (error) {
        status_code = Consts.STATUS_CODE.ERROR.UNKOWN_ERROR;
        res.json({
            "status": false,
            "status_code": status_code,
            "error": error
        })
    }
}

应对“挑战”始终是空的,我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:2)

您非常接近-您已将初始switch中的每个项目映射到一个challenges,该解析为您想要的Promise对象,现在您需要调用{{ 1}}在challenge的数组上以获取它们解析为的值。为了使代码清晰明了,除非有必要,否则最好不要重新分配Promise.all-调用其他新的Promises数组,例如Promises

challenges

这只是一个建议,但是如果您使用challengePromisesexports.getListChallenges = async function(req, res) { var status_code = Consts.STATUS_CODE.ERROR.UNKOWN_ERROR; try { var page_number = parseInt(req.params.page_number); var page_size = parseInt(req.params.page_size); var challenges = await Challenge.find() .skip(page_size * (page_number - 1)) .limit(page_size); status_code = Consts.STATUS_CODE.SUCCESS.DATA_FOUND; var challengePromises = challenges.map(async function(o) { var challenger_club = await Club.findById(o.challenger_club_id); var challege = { challenge: o, challenger_club_name: challenger_club.club_name, challenger_club_avatar: challenger_club.avatar }; return challege; }); var challengeObjs = await Promise.all(challengePromises); res.json({ "status": true, "message": "Challenges found !", "status_code": status_code, "challenges": challengeObjs }); } catch (error) { status_code = Consts.STATUS_CODE.ERROR.UNKOWN_ERROR; res.json({ "status": false, "status_code": status_code, "error": error }) } } ,则可以考虑使用ES6 +语法,例如async而不是{{1 }},尽可能的箭头功能,速记对象属性等等,它们可以使代码更加简洁和易读。例如,我会将您的代码重构为:

await

请注意,如果发生错误,const将始终为var,考虑到原始代码的逻辑-无需重新分配它。