遍历进程列表并推入对象后,GraphQL客户端/前端返回null数组的问题求助
遍历进程列表并推入对象后,GraphQL客户端/前端返回null数组的问题求助
嘿,我看了你的代码和问题描述,这里有几个可能的问题点,帮你梳理一下:
首先,你代码里的await list.forEach(...)完全是无效操作——forEach根本不返回Promise,所以await它不会等任何异步任务完成。如果你的list是通过异步方法获取的,你应该先await获取list本身,而不是await forEach循环:
// 先确保正确拿到进程列表(假设获取list的方法是异步的) const list = await getProcessesList(); let results = []; list.forEach((process) => { results.push({ name: process.name, created_at: process.pm2_env.created_at, pm_uptime: process.pm2_env.pm_uptime, status: process.pm2_env.status, memory: process.monit.memory, cpu: process.monit.cpu }); });
然后,你后面的const contents = await Promise.all(results);也是多余的——results里都是普通的对象,不是Promise实例,Promise.all对它毫无作用,contents和results完全是同一个数组。
接下来,说说为什么前端/GraphQL会拿到null:
- 异步流程错误:如果你的
list没有被正确异步获取(比如没加await),那forEach循环可能是在空数组上执行的,results自然是空数组,GraphQL如果预期非空数组的话可能返回null。 - 嵌套属性不存在:比如某个进程的
pm2_env或者monit是undefined/null,直接访问process.pm2_env.created_at会报错,导致整个对象生成失败,最终数组里可能混入错误或undefined,GraphQL解析时就会转为null。 - Resolver返回问题:你的GraphQL resolver可能忘记返回
results数组,或者返回了undefined,前端就会拿到null。
给你几个具体的修复建议:
1. 改用map生成数组(更简洁可靠)
没必要手动push,直接用map生成结果数组,代码更清晰,同时加空值防护:
// 先确保获取到list const list = await getProcessesList(); // 用map生成结果,同时加可选链防止嵌套属性不存在 const results = list.map(process => ({ name: process.name ?? '未知进程', created_at: process.pm2_env?.created_at ?? null, pm_uptime: process.pm2_env?.pm_uptime ?? null, status: process.pm2_env?.status ?? 'unknown', memory: process.monit?.memory ?? 0, cpu: process.monit?.cpu ?? 0 }));
这里用?.可选链防止嵌套属性不存在时报错,??空值合并运算符给字段设置默认值,避免出现undefined。
2. 检查GraphQL Resolver的返回
确保你的resolver正确返回了results数组,比如:
// 示例Resolver async function processListResolver() { const list = await getProcessesList(); const results = list.map(...); // 上面的map逻辑 return results; // 一定要返回这个数组! }
如果resolver没有return,或者return了undefined,GraphQL就会返回null给前端。
3. 排查list是否正确获取
在生成results之前,先console.log(list)确认它确实是包含进程数据的数组,而不是空数组或undefined。
按照这些步骤排查一下,应该就能解决前端拿到null的问题啦!
备注:内容来源于stack exchange,提问作者Stephanie Cherry
相关产品推荐
相关产品推荐

