Скаляр загрузки Nestjs Apollo graphql

Я использую платформу NestJS GraphQL и хочу использовать скалярную загрузку apollo.

Мне удалось использовать скаляр в другом проекте, в котором не было Nestjs.

схема.graphql App.module.ts регистрирует graphql

    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      resolvers: { Upload: GraphQLUpload },
      installSubscriptionHandlers: true,
      context: ({ req }) => ({ req }),
      playground: true,
      definitions: {
        path: join(process.cwd(), './src/graphql.classes.ts'),
        outputAs: 'class',
      },
      uploads: {
        maxFileSize: 10000000, // 10 MB
        maxFiles: 5
      }
    }),

Мутация pets.resolver.ts

@Mutation('uploadFile')
    async uploadFile(@Args('fileUploadInput') fileUploadInput: FileUploadInput) {
        console.info("TCL: PetsResolver -> uploadFile -> file", fileUploadInput);
        return {
            id: '123454',
            path: 'www.wtf.com',
            filename: fileUploadInput.file.filename,
            mimetype: fileUploadInput.file.mimetype
        }
    }

домашние животные.type.graphql

type Mutation {
        uploadFile(fileUploadInput: FileUploadInput!): File!
}
input FileUploadInput{
    file: Upload!
}

type File {
        id: String!
        path: String!
        filename: String!
        mimetype: String!
}

Я ожидаю, что скаляр работает с nestjs, но мой фактический результат

{"errors":[{"message":"Promise resolver undefined is not a function","locations":[{"line":2,"column":3}],"path":["createPet"],"extensions":{"code":"INTERNAL_SERVER_ERROR","exception":{"stacktrace":["TypeError: Promise resolver undefined is not a function","    at new Promise (<anonymous>)","    at TransformOperationExecutor.transform (E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\TransformOperationExecutor.ts:119:32)","    at E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\TransformOperationExecutor.ts:62:40","    at Array.forEach (<anonymous>)","    at TransformOperationExecutor.transform (E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\TransformOperationExecutor.ts:41:30)","    at _loop_1 (E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\TransformOperationExecutor.ts:226:43)","    at TransformOperationExecutor.transform (E:\\projectos\\Gitlab\\latineo\\latineo-api\\node_modules\\class-transformer\\TransformOperationExecutor.js:240:17)","    at ClassTransformer.plainToClass (E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\ClassTransformer.ts:43:25)","    at Object.plainToClass (E:\\projectos\\Gitlab\\latineo\\latineo-api\\src\\index.ts:37:29)","    at ValidationPipe.transform (E:\\projectos\\Gitlab\\latineo\\latineo-api\\node_modules\\@nestjs\\common\\pipes\\validation.pipe.js:50:41)","    at transforms.reduce (E:\\projectos\\Gitlab\\latineo\\latineo-api\\node_modules\\@nestjs\\core\\pipes\\pipes-consumer.js:15:28)","    at process._tickCallback (internal/process/next_tick.js:68:7)"]}}}],"data":null}

Здравствуйте, вы решили свою проблему? я в точно такой же ситуации :)

Lary Ciminera 30.07.2019 17:24

Нет, извините, был парень, у которого это работало, но он был занят, и я просто переоделся, чтобы отдохнуть: D. попробуй в дискорде discordapp.com/channels/520622812742811698/60153692626826039‌​2

anthony willis muñoz 30.07.2019 19:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
2
6 139
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я решил это, используя библиотеку graphql-upload. Сначала я создал класс для своего скаляра, используя GraphQLUpload из graphql-upload

import { Scalar } from '@nestjs/graphql';

import { GraphQLUpload } from 'graphql-upload';

@Scalar('Upload')
export class Upload {
  description = 'Upload custom scalar type';

  parseValue(value) {
    return GraphQLUpload.parseValue(value);
  }

  serialize(value: any) {
    return GraphQLUpload.serialize(value);
  }

  parseLiteral(ast) {
    return GraphQLUpload.parseLiteral(ast);
  }
}

Что я добавил в свой модуль приложения

@Module({
  imports: [
  ...
    DateScalar,
    Upload,
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
     ...
      uploads: {
        maxFileSize: 10000000, // 10 MB
        maxFiles: 5,
      },
    }),
  ...
  ],
...
})
export class ApplicationModule {}

я также добавил скаляр загрузки в свой graphql

scalar Upload
...
type Mutation {
  uploadFile(file: Upload!): String
}

и работает в моем распознавателе, у меня был доступ к загруженному файлу.

  @Mutation()
  async uploadFile(@Args('file') file,) {
    console.info('Hello file',file)
    return "Nice !";
  }

(примечание: я использовал https://github.com/jaydenseric/apollo-upload-client#function-createuploadlink для загрузки файла, в распознавателе это Node Stream)

Лари, вы столкнулись с проблемой с parseLiteral, ожидая 2 аргумента? }

anthony willis muñoz 02.08.2019 11:11

возможно, вы можете помочь в этом дискорд-канале discordapp.com/channels/520622812742811698/52064948792498588‌​5

anthony willis muñoz 02.08.2019 11:11

нет, я использовал: "apollo-server-express": "2.8.0", "graphql-upload": "^8.0.7" "@types/graphql-upload": "^8.0.0", а вы? ? (я уже в этом раздоре, напишите мне в личку, если хотите, @Lard-man)

Lary Ciminera 02.08.2019 11:22

Для тех, кто пробует это сейчас, graphql-upload включен в apollo-server-express.

Will Squire 07.02.2020 10:22

Использовать импортировать {GraphQLUpload} из "Аполло-сервер-экспресс"
Нет из 'graphql-upload'

import { Resolver, Mutation, Args } from '@nestjs/graphql';
import { createWriteStream } from 'fs';

import {GraphQLUpload} from "apollo-server-express"

@Resolver('Download')
export class DownloadResolver {
    @Mutation(() => Boolean)
    async uploadFile(@Args({name: 'file', type: () => GraphQLUpload})
    {
        createReadStream,
        filename
    }): Promise<boolean> {
        return new Promise(async (resolve, reject) => 
            createReadStream()
                .pipe(createWriteStream(`./uploads/${filename}`))
                .on('finish', () => resolve(true))
                .on('error', () => reject(false))
        );
    }
    
}

Не удается найти GraphQLUpload с помощью apollo-server-fastify. Вы знаете, может ли это работать с Fastify? заранее спасибо

Sir Mishaa 27.02.2021 17:31

Apollo Server 3 удалил «GraphQLUpload», чтобы пользователи могли предоставлять свои собственные механизмы для этих функций.

Masih Jahangiri 26.10.2021 10:39

Обратите внимание, что эта старая версия не полностью совместима с Node 14.

Note: Apollo Server's built-in file upload mechanism is not fully supported in Node 14 and later, and it will be removed in Apollo Server 3. For details, see below.

Правильный ответ для всех версий Apollo Server (полностью совместим с Node 14)

  1. Отключите встроенную обработку загрузки Apollo Server (для apollo 3+ не требуется) и добавьте промежуточное ПО graphqlUploadExpress в свое приложение.
import { graphqlUploadExpress } from "graphql-upload"
import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"

@Module({
  imports: [
    GraphQLModule.forRoot({
      uploads: false, // disable built-in upload handling (for apollo 3+ not needed)
    }),
  ],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(graphqlUploadExpress()).forRoutes("graphql")
  }
}
  1. Удалите импорт GraphQLUpload из apollo-server-core и вместо этого импортируйте из graphql-upload
// import { GraphQLUpload } from "apollo-server-core" <-- remove this
import { FileUpload, GraphQLUpload } from "graphql-upload"

Другие вопросы по теме