You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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;
  }

错误原因

  1. 核心错误:Promise.allSettled返回的每一项是一个结果对象,结构为{ status: "fulfilled"|"rejected", value?: Response, reason?: any }。你把整个结果对象(result)推入了corrects数组,而非对象里的result.value(实际的Response响应对象)。后续调用r.json()时,r是这个结果对象,根本没有json()方法,因此触发类型错误。
  2. 额外问题:原代码处理失败项时,直接把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:10:38