使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码
Responding with a custom HTTP code with GraphQL Yoga from a mutation resolver
我正在使用 GraphQL Yoga 并使用 Prisma 作为我的后端来开发突变解析器。该突变用于进行身份验证并在成功登录时 returning 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 传入的密码进行比较,如果匹配,则 return 签名的 jwt。相当标准的东西。
但是如果没有匹配项,或者如果没有雇主匹配该名称,我想用 403 进行响应。在 express 中,我只是 res.status(403).send({error: "No such username/password"})
但使用 GraphQL Yoga我有点迷路,找不到有关如何执行此操作的任何文档。
感谢任何回复解决这个问题或为我指明正确的方向:)
这里是 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
关注@Lars Holdaas - 我花了太长时间才找到答案。但是上下文参数是 request
和 response
。
如果你使用req/res,它不起作用。所以一个更准确的例子:
new GraphQLServer({
typeDefs,
resolvers,
context: ({ request, response, ...rest }) => {
return {
req: request,
res: response,
userId: request.headers.userid
};
},
})
我正在使用 GraphQL Yoga 并使用 Prisma 作为我的后端来开发突变解析器。该突变用于进行身份验证并在成功登录时 returning 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 传入的密码进行比较,如果匹配,则 return 签名的 jwt。相当标准的东西。
但是如果没有匹配项,或者如果没有雇主匹配该名称,我想用 403 进行响应。在 express 中,我只是 res.status(403).send({error: "No such username/password"})
但使用 GraphQL Yoga我有点迷路,找不到有关如何执行此操作的任何文档。
感谢任何回复解决这个问题或为我指明正确的方向:)
这里是 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
关注@Lars Holdaas - 我花了太长时间才找到答案。但是上下文参数是 request
和 response
。
如果你使用req/res,它不起作用。所以一个更准确的例子:
new GraphQLServer({
typeDefs,
resolvers,
context: ({ request, response, ...rest }) => {
return {
req: request,
res: response,
userId: request.headers.userid
};
},
})