我的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状态代码。
谢谢
答案 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