0

我正在使用 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 我有点迷路并且不能查找有关如何执行此操作的任何文档。

感谢您对此进行整理或指出正确方向的任何回复:)

4

2 回答 2

3

来自棱镜的阿比在这里!

在 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

于 2018-08-31T04:11:21.550 回答
1

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

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

new GraphQLServer({ 
        typeDefs, 
        resolvers,
        context: ({ request, response, ...rest }) => {
          return { 
             req: request, 
             res: response, 
             userId: request.headers.userid
          };
        },
    })
于 2018-12-19T10:43:33.993 回答