使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码

Responding with a custom HTTP code with GraphQL Yoga from a mutation resolver

我正在使用 GraphQL Yoga 并使用 Prisma 作为我的后端来开发突变解析器。该突变用于进行身份验证并在成功登录时 returning 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 传入的密码进行比较,如果匹配,则 return 签名的 jwt。相当标准的东西。

但是如果没有匹配项,或者如果没有雇主匹配该名称,我想用 403 进行响应。在 express 中,我只是 res.status(403).send({error: "No such username/password"}) 但使用 GraphQL Yoga我有点迷路,找不到有关如何执行此操作的任何文档。

感谢任何回复解决这个问题或为我指明正确的方向:)

这里是 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

关注@Lars Holdaas - 我花了太长时间才找到答案。但是上下文参数是 requestresponse

如果你使用req/res,它不起作用。所以一个更准确的例子:

new GraphQLServer({ 
        typeDefs, 
        resolvers,
        context: ({ request, response, ...rest }) => {
          return { 
             req: request, 
             res: response, 
             userId: request.headers.userid
          };
        },
    })