从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中添加一个请求中间件,但是没有办法告诉,正在调用哪个查询,因为所有调用都是在同一个端点完成的。
任何输入都将不胜感激!
答案 0 :(得分:0)
根据graphql规范,端点应始终返回状态200:
http://facebook.github.io/graphql/October2016/#sec-Errors
响应中的错误条目是非空的错误列表,其中 每个错误都是一张地图。
如果在请求的操作期间没有遇到错误,则 错误输入不应出现在结果中。
每个错误都必须包含带有字符串的密钥消息的条目 用于指导开发人员的错误的描述 理解并纠正错误。
如果错误可以与请求中的特定点相关联 GraphQL文档,它应该包含一个带有键位置的条目 带有位置列表,其中每个位置都是带有键的地图 行和列,两个正数从1开始描述 相关语法元素的开头。
GraphQL服务器可能会在选择时为错误提供其他条目 产生更多有用或机器可读的错误,但未来 规范的版本可能会描述错误的其他条目。
如果响应中的数据条目为null或不存在,则为错误 响应中的条目不能为空。它必须包含至少一个 错误。它包含的错误应该表明为什么没有数据能够 被退回。
如果响应中的数据条目不为null,则输入错误条目 响应可能包含执行期间发生的任何错误。如果 执行期间发生错误,应包含这些错误。