我目前正在尝试使用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)
这表明数据未定义,这是一个网络错误。所以我必须在前端设置上做错了。在某种程度上,我没有正确使用阿波罗。似乎很明显错误在我的App.js中我如何定义客户端,但我现在还没有能够得到任何工作,这让我疯狂。我在这个帖子上找不到任何SO帖子。
我已多次浏览过Apollo文档,并且一直试图让某些东西能够工作几天。任何帮助深表感谢。谢谢你的时间。
答案 0 :(得分:2)
问题是localhost
只对您的计算机有意义,但对您的反应本机应用程序没有任何意义,因为服务器没有在其上运行。尝试将localhost
更改为您计算机的IP地址。这应该会引起你的兴趣。
const myLink = new HttpLink({
uri: 'http://{COMPUTER_IP_ADDRESS_HERE}:5000/graphql',
});
以下是处理评论中留下的其他问题。
这是我的一个演示/玩具应用程序的工作登录页面的复制/粘贴。我知道它有效。它基本上做了同样的事情,你尝试了几个不错的添加(例如托管表单状态,将变量传递给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);
您应该能够记录此内容。不确定你所看到的是什么,但我假设它与你的描述中的[Object]
类似。如果这是真的,请尝试使用此console.log('props.data %j', props.data)
,如果可能,将props.data
转换为json。您也可以尝试console.log({props})
查看整个道具树。如果两者都没有按你想要的方式工作,那么你可能还有其他的东西在这里发生。
如果您有更多问题,可能应该打开新的堆栈溢出问题。这些只是一对一的事情,一个问题,一个答案。