使用来自突变解析器的 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 - 我花了很长时间才找到答案。但是上下文参数是requestresponse

如果你使用 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 代码的主要内容,如果未能解决你的问题,请参考以下文章

CORS 阻止 GraphQL Yoga 中的突变

将 Prisma GraphQL-Yoga 用作 Express/Node 应用程序:如何在服务器端调用 GraphQL 突变?

graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?

定义在graphql瑜伽的突变说法

使用 Mongoose 和 graphql-yoga 实现分页

Prisma graphql updateNode 突变