React JS + Apollo 客户端查询错误:“网络错误:无法获取”。从手机打电话时
Posted
技术标签:
【中文标题】React JS + Apollo 客户端查询错误:“网络错误:无法获取”。从手机打电话时【英文标题】:React JS + Apollo client query error: “Network error: Failed to fetch” . when call from mobile phone 【发布时间】:2019-12-03 02:47:11 【问题描述】:我有一个在 Amazon 的 EC2 中运行的测试应用程序。它是一个带有 Apollo、GraphQl 和 Sequelize 的反应应用程序。它可以通过我笔记本的谷歌浏览器完美运行,但是当我从带有 android 的手机打开页面时,会出现此错误
错误网络错误:获取失败 localhost:9000/graphql:1 加载资源失败:net::ERR_CONNECTION_REFUSED
“react-apollo”的版本:“^2.5.6”
我的客户索引
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import RootSession from './App';
import * as serviceWorker from './serviceWorker';
import ApolloClient, InMemoryCache from 'apollo-boost';
import ApolloProvider from 'react-apollo';
const client = new ApolloClient(
uri: "http://localhost:9000/graphql",
fetchOptions:
credentials: 'include'
,
request: operation =>
const token = localStorage.getItem('token');
operation.setContext(
headers:
authorization:token ? token : null,
)
,
cache: new InMemoryCache(
addTypename:false
),
onError: (networkError,graphQLErrors,response,operation,forward)=>
if (networkError)
console.log("network",networkError) ;
if (graphQLErrors)
for(let err of graphQLErrors)
switch (err.extensions.code)
case 'UNAUTHENTICATED':
localStorage.removeItem('token');
);
ReactDOM.render(
<ApolloProvider client=client>
<RootSession />
</ApolloProvider>,
document.getElementById('root'));
serviceWorker.unregister();
我的服务器索引
import express from 'express';
import ApolloServer, AuthenticationError from 'apollo-server-express';
import typeDefs from './data/schema';
import resolvers from './data/resolvers';
import jwt from 'jsonwebtoken';
import dotenv from 'dotenv';
import db from "./models";
dotenv.config(path:'variables.env');
const app = express();
//const cors = require('cors');
//app.use(cors());
const addToken = async (req) =>
const server= new ApolloServer(
typeDefs,
resolvers,
context:async (req)=>
const token = req.headers['authorization'];
let currentUser = null;
if (token !== 'null' && token !== 'undefined' && token !== '' && token !== null && token !== undefined)
try
currentUser = await jwt.verify(token,process.env.SECRET);
req.currentUser = currentUser;
catch (err)
throw new AuthenticationError('Your session expired. Sign in again.');
return user:currentUser,db ;
);
server.applyMiddleware(app);
app.listen(port:9000,()=> console.log(`Server Corriendo http://localhost:9000$server.graphqlPath`));
在我的服务器索引中,我也试过了
const cors = require('cors');
app.use(cors());
但我没有运气
我正在使用 serve -s build 服务客户端(服务 npm 包) 我使用 npm start 为服务器提供服务
怎么样,这条线可能会在手机中中断? (本地主机)
const client = new ApolloClient(
uri: "http://localhost:9000/graphql",
【问题讨论】:
您能分享一下您使用的react-apollo
的版本吗?另外,你知道有问题的浏览器是否支持 fetch 吗?如果不是,您可能需要通过 polyfill 解决。 (apollographql.com/docs/link/links/http/#fetch)
是的,它的“react-apollo”:“^2.5.6”。浏览器是新的
可能是与null
的标头值相关的问题? (github.com/apollographql/react-apollo/issues/…) authorization: token
是否总是在您的所有测试场景中定义?
不,不是这样。我认为这与我如何为客户端代码提供服务有关,但我不知道会是什么
【参考方案1】:
我认为问题在于您使用 localhost
作为您的服务器 URL。当您的浏览器在托管服务器的同一台机器上运行时,这是有效的,但当您在移动设备上运行客户端时,情况就不再如此了。尝试在客户端 URL 中使用用于托管服务器的机器的本地或公共 IP,例如 http://192.168.0.8:9000/
。
这个答案有解释如何在linux上获取本地IP地址:https://***.com/a/13322549/11804768
【讨论】:
错误出现在我使用 localhost 的索引客户端中。我将它更改为具有正确端口的服务器的公共 IP,现在它可以工作了以上是关于React JS + Apollo 客户端查询错误:“网络错误:无法获取”。从手机打电话时的主要内容,如果未能解决你的问题,请参考以下文章
React Apollo 显示“react-apollo 仅支持每个 HOC 的查询、订阅或突变”错误
带有 React 的 Apollo 客户端 2 无法进行查询
React 和 Nexus Graphql 服务器上的 Apollo 客户端出现“必须提供查询字符串”错误
如何使用 GQL 从 React 前端的 Apollo 客户端获取错误
React Apollo 客户端查询抛出错误“提供给`Query`的`array`类型的无效prop`children`,预期`function`”