问问题
7703 次
2 回答
9
这是我如何实现它的。
在服务器端:
// Setup
export default class UnauthorizedError extends Error {
constructor({statusCode = 401, url}) {
super('Unauthorized request to ' + url);
this.statusCode = statusCode;
}
}
// In a resolver
throw new UnauthorizedError({url});
// Setup of the request handler
graphqlExpress(async (req, res) => ({
schema: ...,
formatError(error) {
if (error.originalError instanceof UnauthorizedError) {
res.status(error.originalError.statusCode);
res.set('Location', 'http://domain.tld/login');
} else {
res.status(500);
}
return error;
},
});
在客户端:
const networkInterface = createNetworkInterface();
networkInterface.useAfter([{
applyAfterware({response}, next) {
if ([401, 403].includes(response.status)) {
document.location = response.headers.get('Location');
} else {
next();
}
}
}]);
在 Apollo Client 2.0 中,您可能可以在客户端使用apollo-link-error来实现这一点。
于 2017-12-18T11:15:41.207 回答
1
在graphql解析器中处理重定向的另一种方法是将“状态”设置为302(重定向的http状态代码)和响应中的“位置”,如下面的代码,
this.Query = {
downloadFile: (parent, { url }, { res }) => {
res.status(302);
res.set('Location', url);
return;
}
于 2020-08-20T13:31:18.053 回答