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

时间:2018-08-28 20:42:05

标签: express graphql prisma

我正在使用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我有点迷茫,找不到任何有关此操作的文档。

感谢您对我的回答进行梳理或指出正确的方向:)

2 个答案:

答案 0 :(得分:2)

棱镜的阿比在这里!

在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

答案 1 :(得分:1)

@Lars Holdaas之后-我花了很长时间才得出答案。但是上下文参数是requestresponse

如果使用req / res,则无法使用。举一个更准确的例子:

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