首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NestJS图形库上载多个文件?

如何使用NestJS图形库上载多个文件?
EN

Stack Overflow用户
提问于 2020-09-21 11:15:29
回答 1查看 2.3K关注 0票数 1

我想要创建一个突变,向服务器发送一个包含字符串字段的对象和一个包含照片和描述数组的字段。这是我的InputType:

代码语言:javascript
复制
import { InputType, Field } from '@nestjs/graphql';
import {
  IsString,
  MinLength,
  ValidateNested,
  IsOptional,
  IsBoolean,
  IsUUID,
  IsNotEmptyObject,
} from 'class-validator';
import { FileUpload } from 'graphql-upload';
import { GraphQLUpload } from 'apollo-server-express';

@InputType()
export class HouseTourInput {
  @Field()
  @IsString()
  @MinLength(2)
  title: string;

  @Field()
  @IsString()
  @MinLength(2)
  @IsOptional()
  summary: string;

  @Field()
  @IsString()
  @MinLength(2)
  @IsOptional()
  category: string;

  @Field()
  @IsBoolean()
  @IsOptional()
  featured: boolean;

  @Field()
  @IsUUID()
  authorId: string;

  @Field(type => [SlidesInput])
  @ValidateNested({ each: true })
  slides: SlidesInput[];
}

@InputType()
class SlidesInput {
  @Field(() => GraphQLUpload)
  @IsNotEmptyObject()
  photo: FileUpload;

  @Field()
  @IsString()
  @MinLength(2)
  description: string;
}

这是我的解决方案:

代码语言:javascript
复制
@Resolver(of => HouseTour)
export class AdminResolver {
  constructor(private adminService: AdminService) {}

  @Mutation(returns => HouseTour)
  async createHouseTour(
    @Context('user') user: IMe,
    @Args('input') input: HouseTourInput,
  ) {
    console.log(input);

    // More code irrelevant to this question
  }

输入永远不会登录到控制台中,因为代码似乎从未运行过验证点。以下是错误日志:

代码语言:javascript
复制
  TypeError: Promise resolver undefined is not a function
    at new Promise (<anonymous>)
    at TransformOperationExecutor.transform (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/TransformOperationExecutor.js:139:32)
    at TransformOperationExecutor.transform (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/TransformOperationExecutor.js:273:43)
    at /Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/TransformOperationExecutor.js:73:40
    at Array.forEach (<anonymous>)
    at TransformOperationExecutor.transform (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/TransformOperationExecutor.js:45:19)
    at TransformOperationExecutor.transform (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/TransformOperationExecutor.js:273:43)
    at ClassTransformer.plainToClass (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/ClassTransformer.js:17:25)
    at Object.plainToClass (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/class-transformer/index.js:29:29)
    at ValidationPipe.transform (/Users/babatundeadeyemi/workspace/234homesbackend/node_modules/@nestjs/common/pipes/validation.pipe.js:42:39)

我不知道还能做什么。我在谷歌上搜索过却没有找到答案。

EN

回答 1

Stack Overflow用户

发布于 2021-08-26 16:28:47

我不知道什么是你的错误的根本原因,但我已经跌跌撞撞到图形‘s上传问题,我自己,它一直在实现。

幸运的是,我遇到了下面的github问题,它为我提供了一个可行的解决方案。需要禁用阿波罗的内部图形库上传,并使用graphql-上传

这是我在NestJS GraphQL上上传多幅图像的最后工作解决方案。确保项目根目录中有一个upload文件夹。

src/app.module.ts

代码语言:javascript
复制
import { GraphQLUpload, graphqlUploadExpress } from "graphql-upload"
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"

@Module({
  imports: [
    GraphQLModule.forRoot({
      resolvers: { Upload: GraphQLUpload }, // define the Upload Scalar
      typePaths: ['./**/*.graphql'],
      uploads: false, // disable built-in upload handling
    }),
  ],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(graphqlUploadExpress()).forRoutes("graphql")
  }
}

src/app.resolver.ts

代码语言:javascript
复制
import { Args, Mutation, Query,  Resolver} from '@nestjs/graphql';
import { UseGuards, Inject, Post } from '@nestjs/common';
import { createWriteStream } from 'fs';
import { FileUpload, GraphQLUpload } from "graphql-upload";

@Resolver()
export class AppResolvers {
  @Mutation('uploadImages')
  async uploadFile(@Args('images', {type: () => GraphQLUpload}) imgs: Promise<FileUpload>[]):  Promise<Promise<string>[]> {
    return await Promise.all(
      imgs.map(async (img: Promise<FileUpload>) : Promise<Promise<string>>=>{
        const { filename, mimetype, encoding, createReadStream } = await img;
        console.log("attachment:", filename, mimetype, encoding)
        const stream = createReadStream();
        return new Promise((resolve,reject) =>{
          stream.on('end', () => {console.log("ReadStream Ended")})
            .on('close', () => {console.log("ReadStream Closed")})
            .on('error', (err) => {console.error("ReadStream Error",err)})
          .pipe(createWriteStream(`./upload/${filename}`))
            .on('end', () => {
              console.log("WriteStream Ended");
              resolve("end")
            })
            .on('close', () => {
              console.log("WriteStream Closed");
              resolve("close")
            })
            .on('error',(err) => {
              console.log("WriteStream Error",err);
              reject("error")
            });
        });
      })
    )
  }
}

src/app.graphql

代码语言:javascript
复制
scalar Upload

type Mutation {
    uploadImages(
        images: [Upload]
    ): [String]
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63991157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档