GraphQL / Apollo-无法获取NetworkError

时间:2019-02-25 14:46:30

标签: express graphql apollo apollo-client apollo-server

我的Apollo客户端无法获得任何网络错误,只有GraphQL错误。

我的客户设置如下:

    const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors)
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`)
    );
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

  const client = new ApolloClient({
    link: ApolloLink.from([
      errorLink,
      new HttpLink({
        uri: 'http://localhost:4000/graphql'
      }),
    ]),
  });

在服务器上,我正在按如下方式解析请求:

 .then(res => {
  if (res.ok) {
    return { blah: res.json(), count };
  }
  throw new Error();
})
.catch(error => {
  throw new AuthenticationError('Must Authenticate');
});

AuthenicationError只是作为GraphQL错误([GraphQL error]: Message: Must Authenticate,冒泡到客户端,我基本上只是希望能够从客户端的服务器请求中获取HTTP状态代码。

谢谢

1 个答案:

答案 0 :(得分:0)

您的客户端实现看起来正确。

我猜您正在将express与一些graphl中间件一起使用来处理请求。最主要的是,在graphql中间件开始播放之前,您需要处理身份验证过程。

因此,身份验证是您直接处理的graphql突变。就我而言,它看起来像这样:

...

const app = express();

app.use(
  "/graphql",
  bodyParser.json(),
  (request, response, next) => authenticationMiddleware(request) // authentication is handled before graphql
  .then(() => next())
  .catch(error => next(error)),
  graphqlExpress(request => {
    return {
      schema: executable.schema,
      context: {
        viewer: request.headers.viewer
      },
    };
  }),
);

...

app.listen(...)

另一种可能性是将状态代码添加到graphql错误中的错误响应中。 但这取决于您使用的npm软件包。 例如apollo-server-graphql中的formatError https://www.apollographql.com/docs/apollo-server/api/apollo-server.html#constructor-options-lt-ApolloServer-gt