Express 使用来自突变解析程序的GraphQL Yoga的自定义HTTP代码进行响应
我正在使用GraphQL瑜伽和Prisma为我的后端开发一个突变解析器。变异是为了进行身份验证,并在成功登录时返回JWT。目前的突变情况如下: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
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