Я использую платформу 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}
Нет, извините, был парень, у которого это работало, но он был занят, и я просто переоделся, чтобы отдохнуть: D. попробуй в дискорде discordapp.com/channels/520622812742811698/601536926268260392



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я решил это, используя библиотеку 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 аргумента? }
возможно, вы можете помочь в этом дискорд-канале discordapp.com/channels/520622812742811698/520649487924985885
нет, я использовал: "apollo-server-express": "2.8.0", "graphql-upload": "^8.0.7" "@types/graphql-upload": "^8.0.0", а вы? ? (я уже в этом раздоре, напишите мне в личку, если хотите, @Lard-man)
Для тех, кто пробует это сейчас, graphql-upload включен в apollo-server-express.
Использовать импортировать {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? заранее спасибо
Apollo Server 3 удалил «GraphQLUpload», чтобы пользователи могли предоставлять свои собственные механизмы для этих функций.
Обратите внимание, что эта старая версия не полностью совместима с 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.
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")
}
}
GraphQLUpload из apollo-server-core и вместо этого импортируйте из graphql-upload// import { GraphQLUpload } from "apollo-server-core" <-- remove this
import { FileUpload, GraphQLUpload } from "graphql-upload"
Здравствуйте, вы решили свою проблему? я в точно такой же ситуации :)