【问题标题】:React Apollo Client useQuery Hook gql Uncaught TypeError:(...) is not a functionReact Apollo Client useQuery Hook gql Uncaught TypeError:(...) is not a function
【发布时间】:2020-05-11 05:25:21
【问题描述】:

所以我想使用 Apollo Client react hook "useQuery" 来查询我运行 Apollo Server 的 graphql 后端。

但是定义的查询 const 会返回一个错误,即:Uncaught TypeError:(...) is not a function,因此页面根本没有呈现。

我的 ApolloClient 和 Provider 设置如下:

index.js

import React from 'react';
import { render } from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { ApolloLink, from } from 'apollo-link';
import { ApolloProvider } from 'react-apollo';
import { createUploadLink } from 'apollo-upload-client';

import 'bootstrap/dist/css/bootstrap.min.css';
import App from './components/App';
import './index.css';

const uploadLink = createUploadLink({ uri: process.env.REACT_APP_API_URL });
const httpLink = new HttpLink({
  uri: process.env.REACT_APP_API_URL,
  credentials: 'same-origin'
});
const cache = new InMemoryCache();

const client = new ApolloClient({
  link: ApolloLink.from([
    onError(({ graphQLErrors, networkError }) => {
      if (graphQLErrors)
        graphQLErrors.forEach(({ message, locations, path }) =>
          console.log(
            `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
          )
        );
      if (networkError) console.log(`[Network error]: ${networkError}`);
    }),
    httpLink,
    uploadLink
  ]),
  cache,
  uri: process.env.REACT_APP_API_URL
});

render(
  <ApolloProvider client={client}>
    <Router>
      <App />
    </Router>
  </ApolloProvider>,
  document.getElementById('app')
);

并且App Component会触发查询:

components/game/GamePage.js

import React, { Component } from 'react';
// import GameForm from './gameform';
import GameRules from './gamerules';
// import PropTypes from 'prop-types';

import { gql } from 'graphql-tag';
import { useQuery } from '@apollo/react-hooks';

class GamePage extends Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);

    this.GET_ALL_PLAYERS = gql`
      query allPlayers {
        allPlayers {
          id
          name
          nickname
        }
      }
    `;
  }
  state = { selectedGame: 'X01' };

  componentDidMount() {
    // const players = this.props;
    // players.loadPlayers().catch(err => {
    //   alert('Loading players failed. ' + err);
    // });

    const { loading, error, data } = useQuery(this.GET_ALL_PLAYERS);

    if (loading) console.log('Loading...');
    if (error) console.log(`Error! ${error.message}`);
    console.log(data);
  }

  handleSubmit = gameObject => {
    console.log(gameObject);
    // this.props.createGame(gameObject);
  };

  handleGameChange = game => {
    this.setState({
      selectedGame: game
    });
  };

  render() {
    const styles = {
      margin: '20px'
    };

    return (
      <div className="container-fluid">
        <div className="row">
          <div className="col-md-6">
            <h2 style={styles}>Game Setup</h2>
            {/* <GameForm
              players={this.props.players}
              onSubmit={this.handleSubmit}
              onGameChange={this.handleGameChange}
            /> */}
          </div>
          <div className="col-md-6">
            <h2 style={styles}>Game Rules</h2>
            <GameRules game={this.state.selectedGame} />
          </div>
        </div>
      </div>
    );
  }
}

// GamePage.propTypes = {
//   players: PropTypes.array,
//   games: PropTypes.array,
//   createGame: PropTypes.func.isRequired
// };

export default GamePage;

在加载应用程序时,它会给我上面提到的错误。我像在 2 小时内谷歌搜索和 YouTube 上找到的每个教程一样遵循。但我自己无法解决。除此之外,后端工作得很好。使用 ApolloServer 的 Webserver 测试工具对其进行了测试。

有问题的部分是这样的:

this.GET_ALL_PLAYERS = gql`
  query playersList {
    allPlayers {
      id
      name
      nickname
    }
  }
`;

这是我收到的错误的图片:

因此,我们将不胜感激。 谢谢


编辑:将 {gql} 导入更改为 gql 后出现新错误

【问题讨论】:

    标签: javascript reactjs graphql react-hooks react-apollo


    【解决方案1】:

    如果没有看到完整的错误(包括跟踪),很难确定,但我怀疑您没有正确导入 fromapollo-link 模块确实导出了一个名为 ApolloLink 的类,但该类没有名为 from 的静态方法。相反,您正在寻找来自同一模块的另一个命名导出:

    import { from } from 'apollo-link'
    

    另外请注意,react-apollo-hooks 模块现已弃用,因为钩子 API 现在是 react-apollo 的一部分。您应该升级 react-apollo 并仅将单个 ApolloProvider 用于 hooks 和任何遗留组件。

    编辑:

    查看您的错误,问题出在GamePage 构造函数中(注意第一行是at new GamePage)。同样,这里存在导入问题,因为graphql-tag 没有名为gql 的命名导入。该模块只有文档中显示的默认导出:

    import gql from 'graphql-tag'
    

    【讨论】:

    • 我编辑了原始帖子以表示当前状态。我按照您的说明添加了链接作为命名导入。我也用@apollo/react-hooks 代替了。我将有问题的代码移到了我的 GamePage 的类构造函数中。那是我以后需要它来填写数据的地方。我还在浏览器中遇到的所有错误中添加了图片。错误仍然相同。任何帮助仍然不胜感激。让我知道是否需要更多信息来缩小错误范围。提前致谢。
    • @PatrickHener 请查看我的编辑。您可能会发现使用 VS Code 之类的 IDE 会很有帮助,该 IDE 具有导入、方法等的自动完成功能。这样,如果您开始输入命名的导入或方法名称并且没有看到它弹出,您就会知道之前有问题你甚至可以运行你的代码。
    • 我确实使用 VS Code。但我会调查你今晚所说的话。如果它碰巧很容易解决,那么我将不胜感激。谢谢
    • 好吧,至少现在的错误是不同的。 @丹尼尔里尔登。我的浏览器现在告诉我:react-dom.development.js:16178 Uncaught Error: Invalid hook call。钩子只能在函数组件的主体内部调用。另请参阅上面我编辑中的更新图片
    • 这是否意味着我需要将其转移到函数并使用“useState”,而不是使用类扩展和构造函数与道具?我猜这很容易做到吗?
    猜你喜欢
    • 2018-05-02
    • 2019-04-14
    • 2020-11-29
    • 2018-12-31
    • 2017-03-11
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多