Javascript Sails Waterline ORM查询位于array.map()内

Javascript Sails Waterline ORM查询位于array.map()内,javascript,async-await,sails.js,es6-promise,waterline,Javascript,Async Await,Sails.js,Es6 Promise,Waterline,下面的代码片段使用sails水线ORM进行DB查询并发送响应。但是,执行流程很奇怪,map函数外部的代码在map函数完成执行之前就已经运行了。”“我在地图之外”在“我在地图之内”之前在控制台中打印。我认为可以使用Promise或async/await解决这个问题。我尝试过使用下面的Promise.all(),但它不起作用,响应总是一个空数组。如果你能举例说明如何解决这类问题,我将不胜感激 allMembers: (req, res) => { const projectId = req

下面的代码片段使用sails水线ORM进行DB查询并发送响应。但是,执行流程很奇怪,map函数外部的代码在map函数完成执行之前就已经运行了。”“我在地图之外”在“我在地图之内”之前在控制台中打印。我认为可以使用Promise或async/await解决这个问题。我尝试过使用下面的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的参数。所有
都必须是一个Promise数组。每个
User.findOne
实际上都是一个承诺-绊脚石是一旦使用
.exec
它就不再返回承诺

我认为答案是在
中进行处理。然后
而不是在
.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");
    });
promise只有一个失败回调,因此您失去了单独捕获和处理查询错误的能力(尽管您仍然可以单独处理未找到的结果)。

我正要告诉您“不要在
.map
中使用查询”,但仔细看,我认为您的代码已经接近正常工作了。
Promise的参数。所有
都必须是一个Promise数组。每个
User.findOne
实际上都是一个承诺-绊脚石是一旦使用
.exec
它就不再返回承诺

我认为答案是在
中进行处理。然后
而不是在
.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");
    });

promise只有一个失败回调,因此您失去了单独捕获和处理查询错误的能力(尽管您仍然可以单独处理未找到的结果)。

很好。根据您选择的数据库,您可以使用一个大的
用户。使用用户ID上的或标准查找
,而不是单个的Fondone。@ManuelReil这是我应该采取的方法,waterline肯定可以使用任何基础数据库来查找。我只是想接近OP的逻辑,这是合理的,接近于工作。很好。根据您选择的数据库,您可以使用一个大的
用户。使用用户ID上的或标准查找
,而不是单个的Fondone。@ManuelReil这是我应该采取的方法,waterline肯定可以使用任何基础数据库来查找。我只是想接近OP的逻辑,这是合理的,接近于工作。