【问题标题】:Upload in GraphQL with NestJs and ValidationPipe使用 NestJs 和 ValidationPipe 在 GraphQL 中上传
【发布时间】:2022-04-25 12:00:11
【问题描述】:

我正在尝试使用以下策略在我的 api 中上传文件:https://stephen-knutter.github.io/2020-02-07-nestjs-graphql-file-upload/。

没有 ValidationPipe 工作,但是当我启用 ValidationPipe 时,类转换器上出现此错误:

TypeError: Promise resolver undefined is not a function
    at new Promise (<anonymous>)
    at TransformOperationExecutor.transform (/Users/victorassis/Workspace/barreiroclub/api/node_modules/class-transformer/TransformOperationExecutor.js:117:32)
    at _loop_1 (/Users/victorassis/Workspace/barreiroclub/api/node_modules/class-transformer/TransformOperationExecutor.js:235:45)
    at TransformOperationExecutor.transform (/Users/victorassis/Workspace/barreiroclub/api/node_modules/class-transformer/TransformOperationExecutor.js:260:17)
    at ClassTransformer.plainToClass (/Users/victorassis/Workspace/barreiroclub/api/node_modules/class-transformer/ClassTransformer.js:17:25)
    at Object.plainToClass (/Users/victorassis/Workspace/barreiroclub/api/node_modules/class-transformer/index.js:20:29)
    at ValidationPipe.transform (/Users/victorassis/Workspace/barreiroclub/api/node_modules/@nestjs/common/pipes/validation.pipe.js:40:39)
    at /Users/victorassis/Workspace/barreiroclub/api/node_modules/@nestjs/core/pipes/pipes-consumer.js:15:33
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

我搜索了很多,但看到 class-transformer 已被放弃,答案是不使用 ValidationPipe 进行上传。

有人为此通过并找到了解决方案?

【问题讨论】:

    标签: upload graphql nestjs


    【解决方案1】:

    我尝试按照您上面发布的示例进行操作,然后启用类的转换,并且没有出现您提到的错误。但是在尝试将错误类型的参数放入解析器之前,我遇到了这个错误。 下面是我设置应用引导程序的地方:

    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      app.enableCors({
        origin: extractOrigins(app.get(ConfigService).get('CORS_ORIGINS')),
      });
      app.useGlobalPipes(
        new ValidationPipe({
          transform: true,
        }),
      );
      app.use(graphqlUploadExpress());
      await app.listen(app.get(ConfigService).get('PORT') ?? 3000);
    
      logScaffoldApp(app);
    }
    bootstrap();
    

    解析器代码:

    @Mutation(() => Boolean, { nullable: true })
      async uploadVocabularies(
        @Args({
          name: 'file',
          type: () => GraphQLUpload,
        })
        { createReadStream, filename }: FileUpload,
      ) {
        console.log('attachment:', filename);
    
        const stream = createReadStream();
        stream.on('data', (chunk: Buffer) => {
          console.log(chunk);
        });
      }
    

    当我尝试遵循另一个教程并尝试将参数作为 Promise 时,我确实得到了错误,所以类转换器得到了同样的错误:

    @Mutation(() => Boolean, { nullable: true })
      async uploadVocabularies(
        @Args({
          name: 'file',
          type: () => GraphQLUpload,
        })
        attachment: Promise<FileUpload>,
      ) {
        const { filename, createReadStream } = await attachment;
        console.log('attachment:', filename);
    
        const stream = createReadStream();
        stream.on('data', (chunk: Buffer) => {
          console.log(chunk);
        });
      }
    

    我希望这可以帮助你和其他看过这篇文章的人^^

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2018-08-08
      • 1970-01-01
      • 2019-09-29
      • 2021-01-07
      • 2021-02-23
      • 2023-03-18
      • 2020-05-20
      相关资源
      最近更新 更多