设置 apollo-client 标头时出现 NetworkError

Posted

技术标签:

【中文标题】设置 apollo-client 标头时出现 NetworkError【英文标题】:Getting NetworkError when setup apollo-client headers 【发布时间】:2019-12-22 10:48:10 【问题描述】:

我正在使用 react-native 在 apollo-client 中设置令牌身份验证,但我的应用显示 NetworkError。如果我删除所有身份验证设置,它会正常工作。

Error screenshot

这是一个带有 react-navigation、apollo-client、formik 和 yup 的本地演示应用程序。

App.js

const httpLink = new createHttpLink(
  uri: 'http://192.168.0.2/api/graphql'
);
const authLink = setContext((_,  headers ) => 
  const authToken = localStorage.getItem('authToken');
  return 
    headers: 
      ...headers,
      authorization: authToken ? `JWT $authToken` : '',
    
  
);

const APIClient = new ApolloClient(
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
);

class App extends Component 
  render()
    return (
      <ApolloProvider client=APIClient>
        <SafeAreaView style=styles.container>
          <AppContainer />
        </SafeAreaView>
      </ApolloProvider>
    );
  
;

SignInScreen.js

const TOKENAUTH_MUTATION = gql`
  mutation SignIn($username: String!, $password: String!)
    tokenAuth(username: $username, password: $password)
      token
    
  
`;

class SignInForm extends Component
  constructor(props)
    super(props);
  

  render()
    return(
      <View style=styles.container>
        <Text style=styles.label>Username:</Text>
        <TextInput
          autoCapitalize='none'
          autoFocus=true
          onBlur=this.props.handleBlur('username')
          onChangeText=this.props.handleChange('username')
          style=styles.textInput
          value=this.props.values.username
        />
        <Text style=styles.helpTextInput>this.props.errors.username</Text>
        <Text style=styles.label>Password:</Text>
        <TextInput
          onBlur=this.props.handleBlur('password')
          onChangeText=this.props.handleChange('password')
          secureTextEntry=true
          style=styles.textInput
          value=this.props.values.password
        />
        <Text style=styles.helpTextInput>this.props.errors.password</Text>
        this.props.isSubmitting ? (
          <ActivityIndicator />
        ) : (
          <Button title="Sign In" onPress=this.props.handleSubmit />
        )
      </View>
    );
  


class SignInScreen extends Component

  static navigationOptions = 
    title: "Sign In"
  ;

  _submit(values, actions, mutateFunc)
    mutateFunc(
      variables: values
    );
  

  async _onSuccess(dataResult)
    await AsyncStorage.setItem('authToken', dataResult.tokenAuth.token);
    this.props.navigation.navigate('Questions');
  

  _onError(error)
    alert("ERROR: " + JSON.stringify(error));
  

  render()
    const formValidationSchema = yup.object().shape(
      username: yup.string().required().label("Username"),
      password: yup.string().required().label("Password")
    );

    return(
      <Mutation
        mutation=TOKENAUTH_MUTATION
        onCompleted=dataResult => this._onSuccess(dataResult)
        onError=error => this._onError(error)>
        (signInMutationFunc, loading, error, data) => 
          return (
            <Formik 
              initialValues=
                username: '',
                password: ''
              
              onSubmit=(values, actions) => this._submit(values, actions, signInMutationFunc)
              validationSchema=formValidationSchema>
              formProps => 
                return(<SignInForm ...formProps />);
              
            </Formik>
          );
        
      </Mutation>
    );
  

我希望令牌被存储并在每个请求的标头中使用(如 Apollo 文档所说)。 如果我使用基本的 ApolloClient 它可以工作但不使用标题

const APIClient = new ApolloClient(
  uri: 'http://192.168.0.2/api/graphql'
);

我在 androidios 设备上遇到同样的错误 :'(

【问题讨论】:

【参考方案1】:

好的 在我的示例中,我使用的是 Apollo Boost。当我使用 Apollo Client 时,它可以工作。

【讨论】:

以上是关于设置 apollo-client 标头时出现 NetworkError的主要内容,如果未能解决你的问题,请参考以下文章

添加授权标头时出现CORS错误

apollo-client 没有响应的标头

使用护照Laravel创建令牌时出现异常

仅在发送标头时出现 Cors

全局修改 axios 默认标头时出现问题 - Vue

使用令牌标头进行后 API 调用时出现 405 错误