Vue + Apollo:TypeError:this.getClient(...)。watchQuery不是函数

时间:2018-10-03 11:28:50

标签: vuejs2 apollo apollo-client vue-apollo

我正在尝试使用Vue + Apollo(后端中的Postgraphile GraphQL服务器)设置一个非常简单的查询。

在我的组件中(在脚本标签中):

import { CURRENT_USER_QUERY } from '../constants/graphql';

export default {
  name: 'User',
  data() {
    return {
      currentUser: undefined,
    };
  },
  apollo: {
    currentUser: CURRENT_USER_QUERY,
  },
};

../contants/graphql中,我有:

import gql from 'graphql-tag';

export const CURRENT_USER_QUERY = gql`
  query CurrentUserQuery {
    currentUser {
      id
      username
    }
  }
`;

在我的Graphiql端点中,上面的查询可以正常工作。

但是,当我在Vue中运行它时,会在控制台上收到以下消息:

[Vue warn]: Error in created hook: "TypeError: 
this.getClient(...).watchQuery is not a function"

到处搜索,找不到任何有类似错误的人...

有任何线索吗?我应该从哪里开始看? 谢谢!

3 个答案:

答案 0 :(得分:0)

watchQuery返回的是可观察的,而不是诺言。请参见Apollo docs for ApolloClient.watchQuery或(假设您正在使用vue-apollothe actual code

这意味着您将想要subscribewatchQuery(就像您需要使用observable),而不是像以前那样做thenpromise做)–像这样:

apolloClient.watchQuery({
  query: yourQuery,
  variables: yourVariables
}).subscribe({
  next: (body) => {
    console.log('success', body)
    commit(MY_ACTION, body)
  },
  error: (error, done) => {
    console.error(error)
  }
})

答案 1 :(得分:0)

您必须在WrappedApp上添加ApolloPrivder和ApolloClient,如:

import React from 'react';
import { render } from 'react-dom';
import ApolloClient from 'apollo-boost';
import { ApolloProvider } from '@apollo/react-components';

import App from './App';

const client = new ApolloClient({
    uri: 'http://localhost:2370/graphql'
});

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

render(WrappedApp, document.getElementById('root'));

我知道这是针对React的,但是将同样的东西应用于VUE。

答案 2 :(得分:0)

我不确定为什么会这样。但是我在反应中遇到了同样的错误。 1. Apollo查询应包装在ApooloProvider中,以将react(我认为也应该类似)与apollo连接。

A)

const client = async () => {// remove the async as it will cause trouble
    const client = new ApolloClient({
        link,
        cache,
        defaultOptions,
    });
    return client;
};

const apolloClient = client();
<ApolloProvider client={apolloClient}>
            <BrowserRouter>
                <App />
            </BrowserRouter>
</ApolloProvider>

由于apolloClient中的问题,您可能会收到此错误。对我来说,它抛出了错误,因为我的apolloClient是一个返回了promise(在A中提到)的fn。因此,即使在解决诺言之前,仍要尝试执行useQuery挂钩,但是ApolloProvider尚未解决客户端问题(客户端具有诸如WatchQuery()之类的基本fns来处理useQuery挂钩,因此它会返回错误)。 我从客户端删除了异步,然后我的错误得到了解决,因为阿波罗客户端很容易被提供商使用。