使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码
Posted
技术标签:
【中文标题】使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码【英文标题】:Responding with a custom HTTP code with GraphQL Yoga from a mutation resolver 【发布时间】:2019-02-03 13:30:20 【问题描述】:我正在使用 GraphQL Yoga 开发突变解析器,并将 Prisma 用于我的后端。突变用于进行身份验证并在成功登录时返回 JWT。突变目前看起来像这样:
loginEmployer: async (_, args, context, info) =>
const employer = await context.prisma.query.employer(
where:
name: args.name,
)
const match = await bcrypt.compare(args.password, employer.hashedPassword);
if (match)
return jwt.sign(employer, jwtSecret);
else
return "";
如您所见,该算法相当简单:找到具有匹配名称的雇主,使用 bcrypt 将存储的散列密码与传入的密码进行比较,如果匹配,则返回一个签名的 jwt。很标准的东西。
但是,如果没有匹配项,或者没有与该名称匹配的雇主,我想回复 403。在快递中,我会简单地做res.status(403).send(error: "No such username/password")
,但使用 GraphQL Yoga 我是有点迷路,找不到任何有关如何执行此操作的文档。
感谢您对此进行整理或指出正确方向的任何回复:)
【问题讨论】:
【参考方案1】:关注@Lars Holdaas - 我花了很长时间才找到答案。但是上下文参数是request
和response
。
如果你使用 req/res,它就不起作用。所以一个更准确的例子:
new GraphQLServer(
typeDefs,
resolvers,
context: ( request, response, ...rest ) =>
return
req: request,
res: response,
userId: request.headers.userid
;
,
)
【讨论】:
是的,这也是我最终得到的结果。我猜userId: request.headers.userid
虽然【参考方案2】:
来自 prisma 的 Abhi!
在 GraphQL Yoga 中,您可以传递包含请求和响应的 context
工厂!
这是一个例子!
new GraphQLServer(
typeDefs,
resolvers,
context: ( req, res, ...rest ) =>
// pass things down in context!
return req, res, userId: req.headers.userid ;
,
)
然后在您的解析器中,只需将res
拉出上下文对象即可。
现在这确实工作得很好,但这里有一个 github 问题,关于类似的事情对此有一些其他意见:https://github.com/graphql/express-graphql/issues/71
【讨论】:
啊哈,所以在上下文对象中我可以访问整个 express api? res.status(403).send(blabla) 应该可以吗? 也可以简单地做到context.res.status(403); throw new Error('blabla')
?似乎从瑜伽中投掷返回错误消息并且不会破坏任何内容,但状态代码是 200 所以我只想在投掷之前将其设置为 403。
如果其他人遇到类似的事情:传入参数到上下文的道具称为“请求”和“响应”。在进入的过程中简单地命名它们( req, res )是行不通的。需要是(请求,响应)。除此之外,工作完美:)以上是关于使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码的主要内容,如果未能解决你的问题,请参考以下文章
将 Prisma GraphQL-Yoga 用作 Express/Node 应用程序:如何在服务器端调用 GraphQL 突变?
graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?