将 prisma 对象通过上下文传递给解析器更好还是直接使用它更好?

Jos*_*ana 4 graphql apollo-server prisma prisma-graphql

我想知道直接在解析器中使用 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,
  },
})
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么 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,
})
Run Code Online (Sandbox Code Playgroud)

这个解决方案有什么问题吗?

小智 6

尽管您的方法没有任何问题,但您希望通过上下文来执行此操作的原因如下:

  1. 当您编写单元测试时,您可以轻松地将 prisma 替换为模拟实现。这是一个示例:https ://github.com/javascript-af/javascript-af/blob/1e89e5436fbf0d6e3de37f12e6853a8ff6fc7898/packages/backend/tests/utils/gqlTestClient.ts#L12

  2. 您可以通过这种方式轻松传递两个 prisma 实例,就像您想在其他地方查询数据一样。您可以通过使用两个单独的端点实例化该类并通过上下文对象中的两个键将其传递到 graphql 服务器来传递context.db1和。context.db2Prisma

  3. 在 graphql 文档中,建议通过上下文传递数据库访问。遵循规范总是好的:https ://graphql.org/learn/execution/#asynchronous-resolvers

  • 上下文总是变得一团糟,并鼓励大量的反模式。随着时间的推移,你最终会得到很多垃圾,比如“这个变量是否存在于上下文对象上?”,并且实现细节到处泄漏。我刚刚开始使用图/棱镜,但我真的很想找到更好的方法...... (2认同)