Skip to content

NestJS Integration

npm versionGitHub stars

The @storage-kit/nestjs module provides a native NestJS experience with dependency injection and decorators.

Installation

bash
npm install @storage-kit/nestjs @nestjs/platform-express
# or
pnpm add @storage-kit/nestjs @nestjs/platform-express

Setup Module

Import StorageKitModule in your root AppModule.

typescript
// app.module.ts
import { Module } from "@nestjs/common";
import { StorageKitModule } from "@storage-kit/nestjs";

@Module({
  imports: [
    StorageKitModule.forRoot({
      provider: "minio",
      endpoint: process.env.MINIO_ENDPOINT || "http://localhost:9000",
      accessKeyId: process.env.MINIO_ACCESS_KEY || "minioadmin",
      secretAccessKey: process.env.MINIO_SECRET_KEY || "minioadmin",
    }),
  ],
})
export class AppModule {}

Multi-Provider Configuration

Storage Kit supports configuring multiple storage providers and switching between them at runtime:

typescript
// app.module.ts
import { Module } from "@nestjs/common";
import { StorageKitModule } from "@storage-kit/nestjs";

@Module({
  imports: [
    StorageKitModule.forRoot({
      provider: "minio", // Default provider
      providers: {
        minio: {
          endpoint: "http://localhost:9000",
          accessKeyId: "minioadmin",
          secretAccessKey: "minioadmin",
        },
        "cloudflare-r2": {
          endpoint: "https://account.r2.cloudflarestorage.com",
          accessKeyId: process.env.R2_ACCESS_KEY!,
          secretAccessKey: process.env.R2_SECRET_KEY!,
        },
        s3: {
          region: "us-east-1",
          accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
          secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
        },
      },
      defaultBucket: "uploads",
    }),
  ],
})
export class AppModule {}

Using useProvider() in Services

typescript
import { Injectable } from "@nestjs/common";
import { StorageKitService } from "@storage-kit/nestjs";

@Injectable()
export class FileService {
  constructor(private readonly storage: StorageKitService) {}

  async uploadToCDN(file: Buffer, filename: string) {
    // Use R2 for CDN-served files
    return this.storage.useProvider("cloudflare-r2").uploadFile("cdn", file, filename);
  }

  async archiveFile(file: Buffer, filename: string) {
    // Use S3 for archives
    return this.storage.useProvider("s3").uploadFile("archives", file, filename);
  }

  async deleteFromDefault(key: string) {
    // Use default provider (minio)
    return this.storage.handleDelete("uploads", key);
  }
}

See the Multi-Provider Guide for more details.

Async Configuration

If you need to use ConfigService for secrets:

typescript
StorageKitModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (config: ConfigService) => ({
    provider: "minio",
    endpoint: config.get("MINIO_ENDPOINT"),
    accessKeyId: config.get("MINIO_ACCESS_KEY"),
    secretAccessKey: config.get("MINIO_SECRET_KEY"),
  }),
  inject: [ConfigService],
})

Usage

In Services

Inject StorageKitService to perform operations.

typescript
import { Injectable } from "@nestjs/common";
import { StorageKitService } from "@storage-kit/nestjs";

@Injectable()
export class AvatarService {
  constructor(private readonly storage: StorageKitService) {}

  async uploadAvatar(file: Express.Multer.File, userId: string) {
    return this.storage.handleUpload(
      "avatars-bucket",
      {
        buffer: file.buffer,
        originalName: file.originalname,
        mimeType: file.mimetype,
        size: file.size,
      },
      `users/${userId}`
    );
  }
}

Enable Swagger UI

You can expose the auto-generated API docs in your main.ts:

typescript
async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // Enable Swagger UI at /reference
  StorageKitModule.setupSwagger(app);

  await app.listen(3000);
}

Released under the MIT License.