我想知道是更好还是直接在解析器中使用prisma客户端或通过上下文传递它。
在官方文档中,它是通过上下文传递的:
const { prisma } = require('./generated/prisma-client');
const resolvers = {
Query: {
feed: (parent, args, context) => {
return context.prisma.posts({ where: { published: true } })
}
}
const server = new GraphQLServer({
typeDefs: './src/schema.graphql',
resolvers,
context: {
prisma,
},
})
我的问题是:为什么没有在解析器中直接使用pyramida客户端。
const { prisma } = require('./generated/prisma-client');
const resolvers = {
Query: {
feed: (parent, args, context) => {
return prisma.posts({ where: { published: true } })
}
}
const server = new GraphQLServer({
typeDefs: './src/schema.graphql',
resolvers,
})
此解决方案有什么问题吗?
答案 0 :(得分:1)
尽管您的方法没有错,但有两个原因让您想通过上下文进行操作:
编写单元测试时,可以轻松地用模拟实现交换pyramida。这是一个示例:https://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12
您可以通过这种方式轻松地传递prisma的两个实例,就像您要在其他地方查询数据一样。您可以通过使用两个单独的端点实例化context.db1
类并将其通过上下文对象中的两个键传递给graphql服务器,来传递context.db2
和Prisma
。
在graphql文档中,建议通过上下文传递数据库访问权限。遵循规范总是很高兴:https://graphql.org/learn/execution/#asynchronous-resolvers
答案 1 :(得分:0)
您不希望解析器访问您的完整架构,这是不必要的风险。