在我的解析器内部,我在解析器调用之前检查这个解析器是否受到保护。
如果解析器受到保护,并且用户未登录,我可能会抛出如下错误:
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 中添加一个 before request 中间件,但是没有办法知道正在调用哪个查询,因为所有调用都是针对同一个端点完成的。
任何输入将不胜感激!