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

React GraphQL Apollo Client:JSON解析错误解决及REST API接入疑问

问题1:解决React GraphQL Apollo Client中Error: Unexpected token N in JSON at position 0错误

这个错误的核心原因是Apollo Client尝试解析请求返回的内容为GraphQL格式的JSON,但实际返回的不是合法的GraphQL响应(甚至不是可解析的JSON),常见解决方法:

  • 检查uri配置:确保你指定的uri是标准的GraphQL服务端点,而非REST API地址(比如你第二个问题里的https://randomuser.me/api/是REST接口,直接作为GraphQL uri会导致返回的JSON结构不符合Apollo预期,若地址错误返回404页面的HTML,也会触发解析失败)。
  • 查看实际返回内容:打开浏览器DevTools的Network面板,找到Apollo发送的请求,查看Response标签下的内容。如果是HTML文本(比如"Not Found")或者非GraphQL格式的JSON,说明端点配置错误。
  • 处理REST API场景:如果确实需要调用REST API,不能直接用GraphQL端点的方式,需使用Apollo Client的REST数据源能力:
    1. 安装依赖:npm install @apollo/client @apollo/client/rest
    2. 定义REST数据源类,封装REST请求逻辑
    3. 在Apollo Client中配置对应的link和cache
问题2:能否在GraphQL中使用mealDB API、randomuser.com/api这类REST接口

可以使用,但不能直接将这些REST接口地址作为Apollo Client的uri配置,因为它们不是GraphQL服务,返回的响应格式不符合Apollo Client的预期。正确做法是通过Apollo Client的REST数据源集成这些REST API,以下是针对你提供的代码修改后的示例:

import './App.css';
import React from 'react';
import { ApolloClient, InMemoryCache, ApolloProvider, gql } from "@apollo/client";
import { RESTDataSource, RestLink } from '@apollo/client/rest';
import ShowUsers from './showUsers';

// 定义REST数据源类
class RandomUserAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://randomuser.me/';
  }

  // 封装获取用户数据的方法
  async getUsers() {
    return this.get('api/');
  }
}

// 创建RestLink
const restLink = new RestLink({
  endpoints: {
    randomUser: new RandomUserAPI(),
  },
});

// 配置Apollo Client
const client = new ApolloClient({
  link: restLink,
  cache: new InMemoryCache(),
});

// 在ShowUsers组件中可通过gql查询REST数据(示例)
// const GET_USERS = gql`
//   query GetUsers {
//     users @rest(type: "User", path: "api/") {
//       results {
//         name {
//           first
//           last
//         }
//         email
//       }
//     }
//   }
// `;

const App = () => {
  return (
    <ApolloProvider client={client}>
      <ShowUsers />
    </ApolloProvider>
  );
}

export default App;

关键说明:

  • 通过RESTDataSource类封装REST API的请求逻辑,统一管理baseURL和请求方法
  • 使用RestLink将REST数据源集成到Apollo Client中
  • 通过@rest指令在GraphQL查询中映射REST接口的路径和返回数据类型,实现用GraphQL方式查询REST数据

内容的提问来源于stack exchange,提问作者Ali Mohamadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:15:28