编写GitHub用户获取函数时遇TypeError: r.json is not a function错误求助
getUsers函数报错TypeError: r.json is not a function的排查与解决
问题背景
需要实现一个异步函数getUsers(names),具体要求如下:
- 接收GitHub登录名数组,调用GitHub API(
https://api.github.com/users/USERNAME)批量获取用户信息 - 每个用户发起独立的
fetch请求,所有请求并行执行 - 若请求失败或目标用户不存在,结果数组对应位置返回
null
现有代码运行时抛出错误:TypeError: r.json is not a function,原代码如下:
async function getUsers(names) { let requests = names.map(name => fetch(`https://api.github.com/users/${name}`));//gets users let users = [];//Final answer await Promise.allSettled(requests) .then(responses => new Promise(function(resolve) {// returrn correct users promise let corrects = []; responses.forEach((result) => { if (result.value.ok) { //check statuse 200-299 corrects.push(result); } else { users.push(result); // else add to Finell answer null } }) resolve(corrects); //return users with 200-299 statuse })) .then(corrects => Promise.all(corrects.map(r => r.json()))) //processing .then(results => results.forEach(result => users.push(result))); //add to finel answer correct requests return users; }
错误原因
- 核心错误:
Promise.allSettled返回的每一项是一个结果对象,结构为{ status: "fulfilled"|"rejected", value?: Response, reason?: any }。你把整个结果对象(result)推入了corrects数组,而非对象里的result.value(实际的Response响应对象)。后续调用r.json()时,r是这个结果对象,根本没有json()方法,因此触发类型错误。 - 额外问题:原代码处理失败项时,直接把
result推入users数组,而非需求要求的null;同时通过forEach拼接结果的方式会打乱原数组顺序,最终返回的users数组和输入的names数组顺序不匹配。
修复后的代码
async function getUsers(names) { // 为每个用户名创建fetch请求,并行执行 const requests = names.map(name => fetch(`https://api.github.com/users/${name}`) // 响应状态正常则解析JSON,否则返回null .then(res => res.ok ? res.json() : null) // 捕获请求失败(如网络错误)的情况,返回null .catch(() => null) ); // 等待所有请求完成,返回结果数组(顺序与输入names一致) return Promise.all(requests); }
修复说明
- 顺序一致性:使用
Promise.all处理请求,返回的结果数组顺序和输入的names数组完全对应,满足需求。 - 错误处理全覆盖:既处理了响应状态异常(如用户不存在返回404)的情况,也捕获了请求失败(如网络中断)的场景,确保对应位置返回
null。 - 简化逻辑:移除了冗余的Promise嵌套和中间数组操作,代码更简洁易读,同时避免了原代码中的顺序错乱问题。
内容的提问来源于stack exchange,提问作者Misha100500
相关产品推荐
相关产品推荐

