gpt4 book ai didi

javascript - array.map() 内的 Sails Waterline ORM 查询

转载 作者:行者123 更新时间:2023-12-01 02:46:39 25 4
gpt4 key购买 nike

下面的代码片段使用 sails Waterline ORM 进行数据库查询并发送响应。然而,执行流程很奇怪,在map函数执行完成之前,map函数外部的代码就在运行。 “我在 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.all 的参数必须是一个 Promise 数组。每个 User.findOne 确实是一个 promise - 绊脚石是一旦您使用 .exec 它就不再返回 promise 。

我认为答案是在 .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");
});

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

关于javascript - array.map() 内的 Sails Waterline ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47215858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com