NodeJS+Prisma项目中map内数组有值外部为空如何解决
问题原因
核心是异步代码执行顺序问题:map中传入的async函数会直接返回Promise实例,程序不会等待内部prisma.group.findUnique数据库查询完成,就会继续执行后续的数组打印、用户创建逻辑。此时grouped数组还未被异步操作推入有效值,所以表现为空。
修复方案
使用Promise.all等待所有分组查询执行完成后,再处理数组、执行用户创建逻辑,优化后代码如下:
async function createUser(name, email, groups) { // 生成所有分组查询的Promise数组 const groupQueryTasks = groups.map(async (item) => { const exist = await prisma.group.findUnique({ where: { id: item } }) return exist ? { id: item } : null }) // 等待所有查询完成,过滤掉不存在的分组 const grouped = (await Promise.all(groupQueryTasks)).filter(Boolean) console.log(grouped) // 此处可拿到正确的数组值 const creating = await prisma.user.create({ data: { name, email, groups: { connect: grouped } } }) return creating }
方案说明
- 原写法中的临时数组
grouped可以省略,直接通过map返回查询结果,减少副作用 Promise.all会并行执行所有数据库查询,相比串行遍历查询效率更高filter(Boolean)会自动过滤掉不存在的分组返回的null值,直接得到符合Prismaconnect参数要求的格式
内容的提问来源于stack exchange,提问作者user3729781
相关产品推荐
相关产品推荐

