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数据源能力:
- 安装依赖:
npm install @apollo/client @apollo/client/rest - 定义REST数据源类,封装REST请求逻辑
- 在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
相关产品推荐
相关产品推荐

