Sails Waterline ORM query inside array.map()



下面的代码片段是使用帆水线ORM进行数据库查询和发送响应。但是,执行流程很奇怪,map 函数外部的代码在 map 函数完成执行之前正在运行。"我在地图之外"在控制台中打印在"我在地图内"之前。我认为可以使用承诺或异步/等待来解决这个问题。我尝试使用下面的 Promise.all((,但它不起作用,响应始终是一个空数组。如果您能举例说明如何解决此类问题,我将不胜感激。

allMembers: (req, res) => {
  const projectId = req.params.id;
    ProjectMembers.find({projectId: projectId}).exec( (err, members) => {
        if(err) res.serverError("bad request!");
        if(members.length === 0) res.notFound({message: "No members are found for this project!"});
        let membersInfo = [];
        let promise = Promise.all(members.map(m => {
            User.findOne({id: m.userId}).exec( (err, user) => {
                if(err) membersInfo.push({name: null, userId: null, email:null,rate:null, error: 'Internal error!'})
                else if(!user) membersInfo.push({name: null, userId: null, email:null,rate:null, error: 'No user found'})
                else membersInfo.push({name: user.name, userId: user.id, rate: m.rate, error: null})
                console.log("i am inside of map");
            })
        }));
    console.log("I am outsie of map")
    promise.then( (resolve) => {return res.ok({members: membersInfo})});
}

我正要告诉你"不要在.map中使用查询",但仔细看,我认为你的代码非常接近工作。Promise.all的论点必须是一系列承诺。每个User.findOne确实是一个承诺 - 绊脚石是一旦你使用.exec它就不再返回承诺。

我认为答案是在.then内而不是在.map内进行处理:

ProjectMembers.find({projectId: projectId}).exec( (err, members) => {
    if(err) return res.serverError("bad request!");
    if(members.length === 0) return res.notFound({message: "No members are found for this project!"});
    let promise = Promise.all(members.map(m => User.findOne({id: m.userId})));
    promise.then( (values) => {
        // values is the array of user objects returned from the array of queries
        let membersInfo = values.map((user) => {
            if (!user) {
                return {name: null, userId: null, email:null,rate:null, error: 'No user found'};
            } else {
                return {name: user.name, userId: user.id, rate: m.rate, error: null};
            }
        });
        return res.ok({members: membersInfo});
    }, (err) => {
        return res.serverError("Error finding users");
    });

承诺只有一个失败回调,因此您无法单独捕获和处理查询错误(尽管您仍然可以单独处理未找到的结果(。

最新更新