Javascript Sails Waterline ORM查询位于array.map()内
下面的代码片段使用sails水线ORM进行DB查询并发送响应。但是,执行流程很奇怪,map函数外部的代码在map函数完成执行之前就已经运行了。”“我在地图之外”在“我在地图之内”之前在控制台中打印。我认为可以使用Promise或async/await解决这个问题。我尝试过使用下面的Promise.all(),但它不起作用,响应总是一个空数组。如果你能举例说明如何解决这类问题,我将不胜感激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
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的逻辑,这是合理的,接近于工作。