通过上下文将 prisma 对象传递给解析器更好还是直接使用它更好?
Is better pass prisma object through context to resolvers or use it directly?
我想知道直接在解析器中使用 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,
},
})
我的问题是:为什么在解析器中不直接使用prisma客户端
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,
})
这个方案有什么问题吗?
尽管您的方法没有任何问题,但您还是希望通过上下文执行此操作的原因有几个:
编写单元测试时,可以轻松地将 Prisma 替换为模拟实现。这是一个例子:https://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12
你可以轻松地通过这种方式传递两个 prisma 实例,就像你想在其他地方查询数据一样。您可以通过使用两个单独的端点实例化 Prisma
class 并通过上下文对象中的两个键将其传递给 graphql 服务器来传递 context.db1
和 context.db2
。
在graphql文档中,建议通过上下文传递数据库访问。遵循规范总是好的:https://graphql.org/learn/execution/#asynchronous-resolvers
我想知道直接在解析器中使用 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,
},
})
我的问题是:为什么在解析器中不直接使用prisma客户端
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,
})
这个方案有什么问题吗?
尽管您的方法没有任何问题,但您还是希望通过上下文执行此操作的原因有几个:
编写单元测试时,可以轻松地将 Prisma 替换为模拟实现。这是一个例子:https://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12
你可以轻松地通过这种方式传递两个 prisma 实例,就像你想在其他地方查询数据一样。您可以通过使用两个单独的端点实例化
Prisma
class 并通过上下文对象中的两个键将其传递给 graphql 服务器来传递context.db1
和context.db2
。在graphql文档中,建议通过上下文传递数据库访问。遵循规范总是好的:https://graphql.org/learn/execution/#asynchronous-resolvers