在 Nestjs discord 频道上找到了一些答案。
您必须进行以下更改:
main.ts
async function bootstrap() {
const adapter = new FastifyAdapter();
const fastify = adapter.getInstance();
fastify.addContentTypeParser('multipart', (request, done) => {
request.isMultipart = true;
done();
});
fastify.addHook('preValidation', async function (request: any, reply) {
if (!request.raw.isMultipart) {
return;
}
request.body = await processRequest(request.raw, reply.raw);
});
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
adapter,
);
await app.listen(apiServerPort, apiServerHost);
}
bootstrap();
上传.scalar.ts
import { Scalar } from '@nestjs/graphql';
import { GraphQLUpload } from 'graphql-upload';
@Scalar('Upload')
export class UploadGraphQLScalar {
protected parseValue(value) {
return GraphQLUpload.parseValue(value);
}
protected serialize(value) {
return GraphQLUpload.serialize(value);
}
protected parseLiteral(ast) {
return GraphQLUpload.parseLiteral(ast, ast.value);
}
}
users.resolver.ts
@Mutation(() => CreateUsersOutput, {name: 'createUsers'})
async createUsers(
@Args('input', new ValidationPipe()) input: CreateUsersInput,
@ReqUser() reqUser: RequestUser,
): Promise<CreateUsersOutput> {
return this.usersService.createUsers(input, reqUser);
}
创建-shared.input.ts
@InputType()
export class DataObject {
@Field(() => UploadGraphQLScalar)
@Exclude()
public readonly csv?: Promise<FileUpload>;
}
@InputType()
@ArgsType()
export class CreateUsersInput {
@Field(() => DataObject)
public readonly data: DataObject;
}
另外,我想提一下,你不应该使用全局验证管道(在我的例子中,它们使文件不可读)
// app.useGlobalPipes(new ValidationPipe({ transform: true }));