【问题标题】:Nest.JS graphql subscription does not work with DataLoader (context is not defined)Nest.JS graphql 订阅不适用于 DataLoader(未定义上下文)
【发布时间】:2022-11-08 22:22:12
【问题描述】:

我有一个使用 DataLoader 的 nestjs graphql 应用程序。它适用于查询和突变,但不适用于订阅。这是在 app.module 中定义配置的方式:

@Module({
  imports: [
    ...
    GraphQLModule.forRootAsync({
      driver: ApolloDriver,
      imports: [TasksModule],
      inject: [TasksService],
      useFactory: (tasksService: TasksService) => ({
        playground: true,
        autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
        context: () => createTaskLoaders(tasksService),
        subscriptions: {
          'graphql-ws': true,
          'subscriptions-transport-ws': true
        }
      })
    })
  ]
})
export class AppModule {}

这是在解析器中使用上下文的方式:

  @ResolveField()
  async fieldSet(@Parent() task: Task, @Context() context) {
    console.log('context', Object.keys(context)) // The output is empty when it runs for subscription
    return context.someCustomLoader.load(task.id)
  }

createTaskLoaders 和 someCustomLoader 是什么无关紧要 - 它们只是自定义函数。问题是当从订阅内部使用它们时,它们不会传递给上下文。我想订阅案例需要一些额外的配置,但我找不到任何工作的 Nestjs 数据加载器 + 订阅示例以及有关订阅上下文的文档。

【问题讨论】:

    标签: graphql nestjs subscription dataloader


    【解决方案1】:

    您必须使用 onConnect 在订阅中手动传递加载程序

      subscriptions: {
        'graphql-ws': {
          path: '/graphql',
          onConnect: (context: Context) => {
            const { connectionParams, extra } = context;
    
            extra.loaders = createTaskLoaders(tasksService);
          },
        },
        'subscriptions-transport-ws': {
          path: '/graphql',
          onConnect: (connectionParams) => {
            return {
              loaders: createTaskLoaders(tasksService),
            };
          },
        },
      },
    

    像这样的东西应该工作

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 2021-11-09
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2021-03-17
      • 2019-04-14
      相关资源
      最近更新 更多