React Native:为什么使用Apollo的GraphQL查询返回未定义?

时间:2017-11-21 04:21:21

标签: javascript react-native graphql apollo react-apollo

我目前正在尝试使用GraphQL查询并使用Apollo,在我的React Native应用程序上显示结果。

以下是App.js中的相关代码:

import {LoginScreen} from './src/Screens'
import ApolloClient from 'apollo-client';
import { ApolloProvider } from 'react-apollo';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';

const myLink = new HttpLink({
  uri: 'http://localhost:5000/graphql',
});

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

export default class App extends React.Component{
  render() {
    return(
      <ApolloProvider client={client}>
        <LoginScreen/>
      </ApolloProvider>
    )}
}'

这是LoginScreen.js中的相关代码

function ShowUser({data: { loading, otsUserByUserId }}) {
    if (loading) {
      return <Text>Loading</Text>;
    } else {
        console.log("Ots user is " + otsUserByUserId)
        console.log("Data: " + data)
      return (
        <View>
            {otsUserByUserId.map(user =>
                <Text>The name of user is {user.firstName} {user.lastName}.</Text>
            )}
        </View>
      );
    }
  }

export default graphql(gql`
    query otsUser{
        otsUserByUserId(userId:1) {
            firstName
            lastName
        }
    }
`)(ShowUser)

我的查询适用于GraphiQL,如您所见: Graphiql Query

只是为了表明我正在为我的链接使用正确的端点: Start GraphQL Server

运行时,在我的调试器中,我看到了 Chrome Developer Tools Response

这表明数据未定义,这是一个网络错误。所以我必须在前端设置上做错了。在某种程度上,我没有正确使用阿波罗。似乎很明显错误在我的App.js中我如何定义客户端,但我现在还没有能够得到任何工作,这让我疯狂。我在这个帖子上找不到任何SO帖子。

我已多次浏览过Apollo文档,并且一直试图让某些东西能够工作几天。任何帮助深表感谢。谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

问题是localhost只对您的计算机有意义,但对您的反应本机应用程序没有任何意义,因为服务器没有在其上运行。尝试将localhost更改为您计算机的IP地址。这应该会引起你的兴趣。

const myLink = new HttpLink({
  uri: 'http://{COMPUTER_IP_ADDRESS_HERE}:5000/graphql',
});

更新:11/21

以下是处理评论中留下的其他问题。

  1. 如果你有更好的想法,请不要犹豫告诉我,我会尝试。
  2. 为什么我不能做console.log(props.data)?
  3. 1。我是怎么做到的

    这是我的一个演示/玩具应用程序的工作登录页面的复制/粘贴。我知道它有效。它基本上做了同样的事情,你尝试了几个不错的添加(例如托管表单状态,将变量传递给HOC,localstorage缓存)。您应该能够从中获得所需,并轻松地将其调整到您的用例。

    // LoginScreen.js
    import React from 'react';
    import { gql, graphql } from 'react-apollo';
    import { Button, Input } from 'rebass';
    
    import { AUTH_TOKEN_KEY } from '../config';
    
    class Login extends React.Component {
      state = {
        form: {
          email: '',
          password: ''
        },
        submitting: false
      };
    
      handleSubmit = evt => {
        evt.preventDefault();
        this.setState({
          submitting: true
        });
    
        const { email, password } = this.state.form;
        this.props
          .signinUser({ variables: { email, password } })
          .then(res => {
            window.localStorage.setItem(AUTH_TOKEN_KEY, res.data.signinUser.token);
            window.location = '/';
          })
          .catch(err => console.error(err));
      };
    
      handleChange = evt => {
        const { name, value } = evt.target;
    
        this.setState({
          form: {
            ...this.state.form,
            [name]: value
          }
        });
      };
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <h1>Login</h1>
            <Input
              type="text"
              name="email"
              label="Email"
              value={this.state.form.email}
              // baseRef={ref => ref.focus()}
              onChange={this.handleChange}
            />
            <Input
              type="password"
              name="password"
              label="Password"
              value={this.state.form.password}
              onChange={this.handleChange}
            />
            <Button>Login</Button>
          </form>
        );
      }
    }
    
    const signinUser = gql`
      mutation($email: String!, $password: String!) {
        signinUser(email: { email: $email, password: $password }) {
          token
        }
      }
    `;
    
    export default graphql(signinUser, { name: 'signinUser' })(Login);
    

    2。的console.log(props.data)

    您应该能够记录此内容。不确定你所看到的是什么,但我假设它与你的描述中的[Object]类似。如果这是真的,请尝试使用此console.log('props.data %j', props.data),如果可能,将props.data转换为json。您也可以尝试console.log({props})查看整个道具树。如果两者都没有按你想要的方式工作,那么你可能还有其他的东西在这里发生。

    如果您有更多问题,可能应该打开新的堆栈溢出问题。这些只是一对一的事情,一个问题,一个答案。