Angular / Nest / GraphQL - невозможно выполнить загрузку файла (400 неверных запросов или 500) - PullRequest
0 голосов
/ 28 марта 2020

Из того, что я видел онлайн, все здесь должно работать, в практическом плане я получаю 400 плохих запросов от клиента и 500 (неправильный порядок) от почтальона

// app.module.ts
 GraphQLModule.forRoot({
      cors: true,
      playground: true,
      debug: true,
      autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
      // installSubscriptionHandlers: true,
      uploads: true,
      context: ({ req, res }) => ({
        req,
        res,
      }),
// File upload mutation in random resolver
  @Mutation(() => ResponseMessage)
  async uploadSigleFile(
    @Args({ type: () => GraphQLUpload, name: 'upload', nullable: true })
    upload: FileUpload,
  ) {
    console.log(upload.filename, upload.mimetype);
    return new ResponseMessage({ response: 'ciao' });
  }

Ссылка Graphql, где я включил составные данные (фактически запрос корректно отображается как составные)

const uri = `${environment.serverUrl}/graphql`; // <-- add the URL of the GraphQL server here
export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
  return {
     link: httpLink.create({ uri, useMultipart: true }),
    cache: new InMemoryCache()
  };
}

@NgModule({
  exports: [ApolloModule, HttpLinkModule],
  providers: [
    {
      provide: APOLLO_OPTIONS,
      useFactory: createApollo,
      deps: [HttpLink]
    }
  ]
})
export class GraphQLModule {}

Мутация Graphql, которая генерирует angular сервис

mutation Super($upload: Upload) {
  uploadSigleFile(upload: $upload) {
    response
  }
}

Где вызывается мутация (да, я проверил и файлы на самом деле приходят к мутации)

  onFileChange(e: HTMLInputEvent) {
    const myFile = e.target.files[0];
    this.apolloQuery(myFile);
  }

  apolloQuery(upload: File) {
    this.superGql
      .mutate({
        upload
      })
      .subscribe(({ errors, context, data, extensions }) => {

      });
  }

Это сводит меня с ума, я буду вечно благодарен тому, кто поможет, я пробовал любую возможную комбинацию, я не знаю, что мне не хватает (например: скаляр нестандартного гнезда или импорт его в поле распознавателей с использованием apollo-client-upload в клиенте)

1 Ответ

1 голос
/ 28 марта 2020

Да, в конце концов, apollo автоматически анализирует многочастные запросы, и использование скаляра в подходе с первым кодом привело к тому, что он был проанализирован 2 раза (не имеет никакого смысла, но все равно)

Итак, в конце я просто нужно было написать скалярное гнездо для загрузки, которое абсолютно ничего не делало

import { Scalar, CustomScalar } from '@nestjs/graphql';
// FileUpload is just an interface, not really useful in any way here, just to be // explicit of what type comes out whenever I want to check out the scalar
import { FileUpload } from 'graphql-upload';

@Scalar('Upload')
export class UploadScalar implements CustomScalar<object, any> {
  description = 'Upload custom scalar type';


// the value arrives here already parsed
  parseValue(value: FileUpload) {
    return value;
  }


  // You dont use this
  serialize(value: any) {
    return null;
  }

  // You dont use this
  parseLiteral(ast) {
    return null;
  }
}
//app.module.ts
GraphQLModule.forRoot({
      autoSchemaFile: join(process.cwd(), 'schema.graphql'),
      context: req => ({ req }),
      uploads: true,
    })

// random.resolver.ts
@Query(() => MainObject)
  async boh(
    @Args({ name: 'file', type: () => FileUpload, nullable: true })
    file: FileUpload,
  ) {
    return new Promise((resolve, reject) => {
      const read = file.createReadStream();
      const write = fs.createWriteStream(path.join(process.cwd(), 'file3.csv'));
      read.pipe(write);
      read.on('close', () => {
        resolve(new MainObject({ response: 'tutto ok', age: 200 }));
      });
    });
  }
...