NestJS+GraphQL项目导入graphql-upload报错:无GraphQLUpload导出成员
解决graphql-upload导入GraphQLUpload报错的问题
问题根源
graphql-upload从v16.x版本开始,不再导出GraphQLUpload成员,改用Upload标量类型;同时NestJS的GraphQL模块有专属的文件上传配置流程,直接手动导入旧类型会导致报错。
具体解决方案
1. 修正导入方式
放弃导入GraphQLUpload,改用Upload类型,正确的TypeScript导入语法:
import { Upload } from 'graphql-upload';
2. 配置NestJS GraphQL模块的文件上传支持
在app.module.ts中配置GraphQL模块,并在main.ts添加上传中间件:
// app.module.ts import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { Upload } from 'graphql-upload'; @Module({ imports: [ GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: true, context: ({ req }) => ({ req }), buildSchemaOptions: { scalarsMap: [{ type: Upload, scalar: 'Upload' }], }, }), ], }) export class AppModule {}
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { graphqlUploadExpress } from 'graphql-upload'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 添加上传中间件,需放在GraphQL模块初始化前 app.use(graphqlUploadExpress({ maxFileSize: 10 * 1024 * 1024, maxFiles: 10 })); await app.listen(3000); } bootstrap();
3. 在Resolver中正确使用Upload类型
示例Resolver代码,实现文件上传逻辑:
import { Resolver, Mutation, Args } from '@nestjs/graphql'; import { Upload } from 'graphql-upload'; import { createWriteStream } from 'fs'; import { join } from 'path'; import { mkdirSync } from 'fs'; @Resolver() export class FileResolver { @Mutation(() => String) async uploadFile(@Args('file') file: Upload): Promise<string> { const { createReadStream, filename } = await file; // 确保uploads目录存在 const uploadDir = join(process.cwd(), 'uploads'); mkdirSync(uploadDir, { recursive: true }); return new Promise((resolve, reject) => { createReadStream() .pipe(createWriteStream(join(uploadDir, filename))) .on('finish', () => resolve(`文件${filename}上传成功`)) .on('error', (err) => reject(`上传失败:${err.message}`)); }); } }
4. 确保依赖版本匹配
将@types/graphql-upload版本与graphql-upload版本对齐,避免类型不匹配:
"graphql-upload": "^16.0.2", "@types/graphql-upload": "^16.0.2"
执行npm install或yarn install重新安装依赖。
5. 避免模块语法混用
项目使用TypeScript,统一用ES模块的import语法,不要混用CommonJS的require,防止模块解析冲突。
内容的提问来源于stack exchange,提问作者webs1 prompta
相关产品推荐
相关产品推荐

