Apollo 客户端错误:在上下文中找不到“客户端”或作为选项传入。将根组件包装在 <ApolloProvider> 中

Posted

技术标签:

【中文标题】Apollo 客户端错误:在上下文中找不到“客户端”或作为选项传入。将根组件包装在 <ApolloProvider> 中【英文标题】:Apollo Client Error: Could not find "client" in the context or passed in as an option. Wrap the root component in an <ApolloProvider> 【发布时间】:2021-04-19 03:38:02 【问题描述】:

我是新来做这个阿波罗。

我目前正在尝试使用 React 和 Apollo 创建一个应用程序。

当我启动我的应用程序时,我收到以下错误:

在上下文中找不到“客户端”或作为选项传入。将根组件包裹在 中,或通过选项传入 ApolloClient 实例。

Here is my RegisterController -> index.tsx

import * as React from "react";
import  ChildMutateProps, graphql  from 'react-apollo';
import gql from 'graphql-tag';

interface Props 
  children: (
    data:  submit: (values: any) => Promise<null> 
  ) => JSX.Element | null;


class C extends React.PureComponent<ChildMutateProps<Props, any, any>> 
  submit = async (values: any) => 
    console.log(values);

    const response = await this.props.mutate(
      variables: values
    );

    console.log('response: ', response);

    return null;
  ;

  render() 
    return this.props.children( submit: this.submit );
  


const registerMutation = gql`
  mutation($email: String!, $password: String!) 
    register(email: $email, password: $password) 
      path
      message
    
  
`;

export const RegisterController = graphql(registerMutation)(C);

这是我的主要 index.tsx

import React from 'react';
import ReactDOM from 'react-dom';

import reportWebVitals from './reportWebVitals';
import  ApolloProvider  from 'react-apollo';
import  client  from './apollo';
import  Routes  from './routes';
import "./index.css";

ReactDOM.render(
  <ApolloProvider client=client>
    <React.StrictMode>
      <Routes />
    </React.StrictMode>
  </ApolloProvider>,
  document.getElementById('root')
);

最后,这是我的 package.json


  "name": "@abb/controller",
  "version": "1.0.0",
  "main": "dist/index.js",
  "typings": "dist/index.d.ts",
  "license": "MIT",
  "scripts": 
    "build": "rm -rf ./dist && tsc"
  ,
  "dependencies": 
    "graphql": "^15.4.0",
    "graphql-tag": "^2.11.0",
    "react": "^17.0.1",
    "react-apollo": "^3.1.5",
    "react-dom": "^17.0.1"
  ,
  "devDependencies": 
    "@types/node": "^14.14.20",
    "@types/react": "^17.0.0",
    "@types/react-dom": "^17.0.0",
    "tslint": "^6.1.3",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^4.1.3"
  

正如您在我的 index.tsx 中看到的,它被 ApolloProvider 包裹,客户端传入其中。 为什么我收到此错误? 谁能帮我解决这个问题?

谢谢。

【问题讨论】:

【参考方案1】:

react-apollo 已弃用

React Apollo 功能现在可以直接从 @apollo/客户端

在这里阅读: https://github.com/apollographql/react-apollo#readme

显然,问题在于您的软件包的版本apollo V3 将一些客户端软件包分组以避免这些问题)。阅读更多:https://www.apollographql.com/docs/react/migrating/apollo-client-3-migration/。

使用 apollo 客户端 v3(自 2020 年 6 月起)

改为使用apollo-client: https://github.com/apollographql/apollo-client。

命令:

npm install @apollo/client

导入:

import  ApolloProvider  from '@apollo/client'

按照此分步示例进行操作: https://www.apollographql.com/docs/react/get-started/

【讨论】:

我的代码与@Eunicorn 完全相同,我迁移到@apollo/client 但由于某些原因我仍然遇到同样的问题。你解决了吗?【参考方案2】:

就我而言,我可以通过将客户端值传递到查询挂钩来解决此问题,如下所示:

  import  appClient  from 'src/config/apollo'; //this is a config file in my repo where I'm defining the client location/info
  import  useGetMyDataQuery  from '../documents/GetMyData.generated'; // the React/Typscript file generated from the GraphQL query file
  ...
  const  loading, data, error  = useGetMyDataQuery(
    client: appClient,
  );

而在更改之前,我的查询挂钩如下所示:

  const  loading, data, error  = useGetMyDataQuery();

【讨论】:

【参考方案3】:

我幸运地将@apollo/clientv3.5.x 降级到v3.4.17,并且我的测试(这是我遇到此错误的地方)再次开始通过。

npm i @apollo/client@3.4.17

【讨论】:

以上是关于Apollo 客户端错误:在上下文中找不到“客户端”或作为选项传入。将根组件包装在 <ApolloProvider> 中的主要内容,如果未能解决你的问题,请参考以下文章

在 Query 的上下文中或作为传递的道具中找不到“客户端”

next.js + GraphQL:“不变违规:在上下文中找不到“客户端”或作为选项传入......”

Spring Eureka 服务器在客户端 url 中找不到上下文路径

Apollo 服务器:在上下文中抛出错误总是在客户端返回 http 400 错误

React Uncaught Invariant Violation:在 ApolloConsumer 的上下文中找不到“客户端”。将根组件包装在 <ApolloProvider> 中

在 wcf 客户端 app.config 错误(自主机)中找不到端点元素