网络错误:在新的ApolloError中JSON位置0处出现意外的“<”标记。

17

enter image description here

const httpLink = createHttpLink({
  uri: 'http://localhost:3090/'
})

const client = new ApolloClient({
  link: httpLink,
  cache: new InMemoryCache()
})

client.query({
  query: gql`
    query users {
        email
    }
  `,
})
  .then(data => console.log(data))
  .catch(error => console.error(error));

在客户端代码中执行此查询时会出现错误,但是当我在浏览器上执行此查询时(http://localhost:3090/graphql),可以正确地获取数据。


在开发者控制台中打开网络选项卡,告诉我们ApolloError是什么。 - StackedQ
@kiarashws为该请求添加了一张截图。 - Mukesh Kumar
正如您所看到的,状态码是404(未找到),这意味着给定的URL不正确。 - StackedQ
看起来你的请求没有得到 JSON 对象的回应,而是一个 HTML 页面 <HTML>...。这通常是未处理错误的情况下发生的,此时会返回默认的错误页面。因为你正在连接根 URL,所以我猜测是 404 错误? - Freek Wiekmeijer
8个回答

27

你发送查询请求到的graphql端点缺少/graphql。所以你的服务器可能会返回一个以<开头的包含404错误消息的HTML文档,Apollo试图将其解析为查询结果但失败了。

请检查httpLink是否实际上是localhost:3090/graphql

此外,查询的语法有两种形式:

{
    users {
        email
    }
}

或者如果您想为查询命名:

query Users {
    users {
        email
    }
}

@MukeshKumar 请在你的问题中添加完整的错误信息。 - trixn
在添加/graphql后,返回已翻译的文本。 - Mukesh Kumar
@MukeshKumar 是的。没有错误信息我无法告诉你为什么它失败了。 - trixn
POST http://localhost:3090/graphql 400 (错误请求) index.js:1452 错误:网络错误:响应不成功:收到状态码400 在新的ApolloError中(ApolloError.js:58) 在QueryManager.js:522 在QueryManager.js:982 在数组中forEach(<anonymous>) 在QueryManager.js:981 在Map.forEach(<anonymous>) 在QueryManager.broadcastQueries(QueryManager.js:977) 在QueryManager.js:477 - Mukesh Kumar
@MukeshKumar,恐怕这并没有包含任何有用的信息。但我认为你的查询语法也是不正确的。正确的写法应该是:gql`{ users { email } }qgl`query Users { users { email } }` - trixn
看起来是网络问题。检查一下你的后端服务在哪里提供。我也犯了同样的错误。 - tufac2

1

0
在我的情况下,我的graphql端点url中有一个错别字。我不小心在末尾添加了几个字符。我认为最好的做法是为这种情况添加一个catch规则,这样它就不会破坏网站,只是不显示内容并将错误发布到控制台日志中。

0
在我的情况下,当我从一个指向端口3000create-react-app切换到一个next JS应用程序时,我收到了相同的错误。React应用程序保存了一些值到本地存储(令牌)。在我的情况下,我所要做的就是清除localhost:3000的本地存储,然后我就摆脱了这个错误。

0
请确保您已将httpLink和wsLink的uri配置为相同。 当我使用不同的uri时,我曾经看到过这个错误,如下所示。
httpLink的uri为:“http://localhost:4000” wsLink的uri为:“ws://localhost:4000/graphql”
将httpLink的uri设置为http://localhost:4000/graphql有助于解决问题。

0

当您在查询文件中未正确定义路径时,就会发生这种情况。这是传递参数时的类型检查错误。


0

正如@Trixn所说:“因此,您的服务器可能会返回一个以<html...开头的包含404错误消息的HTML文档。Apollo尝试将其解析为查询结果并无法成功。”

在我的情况下,我没有在URL开头放置“http://”,这导致返回一个带有错误消息的HTML网页。

还要检查通常应使用“https://”


0
在我的情况下,这个错误是由于我在 API URL 后面加了一个斜杠导致的。可能的解决方法是仔细检查你的 API URL,并确保它引用了正确的 URL。
在我的情况下,我只需要在 URL 后面去掉尾随的斜杠/即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接