Express 使用来自突变解析程序的GraphQL Yoga的自定义HTTP代码进行响应

Express 使用来自突变解析程序的GraphQL Yoga的自定义HTTP代码进行响应,express,graphql,prisma,Express,Graphql,Prisma,我正在使用GraphQL瑜伽和Prisma为我的后端开发一个突变解析器。变异是为了进行身份验证,并在成功登录时返回JWT。目前的突变情况如下: loginEmployer: async (_, args, context, info) => { const employer = await context.prisma.query.employer({ where: { name: args.name, } }) const match = awai

我正在使用GraphQL瑜伽和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回答。在express中,我只需执行
res.status(403).send({error:“没有这样的用户名/密码”})
,但在GraphQL瑜伽中,我有点迷路了,找不到有关如何执行此操作的任何文档

谢谢你的回复,帮我整理一下或者给我指出正确的方向:)

这里是普里斯玛的阿比

在GraphQL瑜伽中,您可以传递一个包含请求和响应的
上下文
工厂

这里有一个例子


新建GraphQLServer({
typeDefs,
解析器,
上下文:({req,res,…rest})=>{
//在上下文中传递东西!
返回{req,res,userId:req.headers.userId};
},
})

然后在解析器中,只需从上下文对象中拉出
res

现在这确实很好,但这里有一个github的问题,关于一个类似的东西,有一些其他的观点:

来自prisma的Abhi

在GraphQL瑜伽中,您可以传递一个包含请求和响应的
上下文
工厂

这里有一个例子


新建GraphQLServer({
typeDefs,
解析器,
上下文:({req,res,…rest})=>{
//在上下文中传递东西!
返回{req,res,userId:req.headers.userId};
},
})

然后在解析器中,只需从上下文对象中拉出
res


现在,这确实很好地工作了,但这里有一个github的问题,关于一个类似的事情,有一些其他的观点:

跟随@Lars Holdaas-我花了太长时间才找到答案。但是上下文参数是
请求
响应

如果使用req/res,它将不起作用。更准确的例子是:

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

跟随@Lars Holdaas——我花了太长时间才找到答案。但是上下文参数是
请求
响应

如果使用req/res,它将不起作用。更准确的例子是:

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

啊哈,那么在上下文对象中我可以访问整个express api?res.status(403).send({blablabla})应该可以工作吗?也可以简单地执行
context.res.status(403);抛出新错误('blabla')
?从瑜珈中抛出似乎会返回错误消息,不会中断任何内容,但状态代码是200,所以我只想在抛出之前将其设置为403。如果其他人也在为类似的问题而挣扎:传入参数上的道具被称为“请求”和“响应”。在输入的过程中简单地命名它们({req,res})是行不通的。需要是({request,response})。除此之外,它工作得非常完美:)啊哈,那么在上下文对象中我可以访问整个express api吗?res.status(403).send({blablabla})应该可以工作吗?也可以简单地执行
context.res.status(403);抛出新错误('blabla')
?从瑜珈中抛出似乎会返回错误消息,不会中断任何内容,但状态代码是200,所以我只想在抛出之前将其设置为403。如果其他人也在为类似的问题而挣扎:传入参数上的道具被称为“请求”和“响应”。在输入的过程中简单地命名它们({req,res})是行不通的。需要是({request,response})。除此之外,工作完美:)是的,这也是我最后得到的。我猜
userId:request.headers.userId
thoughYeah这也是我最终得到的结果。我猜
userId:request.headers.userId