从graphql yoga中,在调用解析程序之前,我会检查解析程序的内部,看这个解析程序是否受到保护。
如果解析器受到保护,并且用户未登录,我可以抛出如下错误:
return new Error('Token is missing');
这将停止请求的执行,并返回正确的消息形状,并带有一个错误字段。
{
"data": null,
"errors": [
{
"message": "Token is missing",
"locations": [
{
"line": 3,
"column": 3
}
],
"path": [
"users"
]
}
]
}
但响应的状态为200,这是不正确的。我希望能够选择自己的状态,例如403。
以下是我当前的解析器实现:
const withAuth = authed => (_, args, context, ...rest) => {
if (!context.token) {
return new Error('Token is missing');
}
let result = null;
try {
result = jwt.verify(context.token, process.env.HASH);
} catch (__) {
return new Error('Incorrect token');
}
const { username, email } = result;
if (!username || !email) {
return new Error('Incorrect token');
}
return authed(_, args, { ...context, user: { username, email } }, ...rest);
};
const resolvers = {
Query: {
users: withAuth(resolver(User)), //get users from db
}
我想在express中添加一个请求前中间件,但无法判断调用的是哪个查询,因为所有调用都是对同一个端点进行的。
如有任何意见,我们将不胜感激!