Minio Module for Nest framework
Description
This's a nest-minio module for Nest.
This quickstart guide will show you how to install the client SDK and execute an example JavaScript program. For a complete list of APIs and examples, please take a look at the JavaScript Client API Reference documentation.
This document assumes that you have a working nodejs setup in place.
Installation
$ npm i --save nestjs-minio
Initialize MinIO Client
You need five items in order to connect to MinIO object storage server.
| endPoint | URL to object storage service. |
| port | TCP/IP port number. This input is optional. Default value set to 80 for HTTP and 443 for HTTPs. |
| accessKey | Access key is like user ID that uniquely identifies your account. |
| secretKey | Secret key is the password to your account. |
| useSSL | Set this value to 'true' to enable secure (HTTPS) access |
Provide the credentials for minio module by importing it as :
import { Module } from '@nestjs/common';
import { NestMinioClientController } from './nest-minio-client.controller';
import { NestMinioModule } from '../nest-minio.module';
@Module({
controllers: [NestMinioClientController],
imports: [
NestMinioModule.register({
isGlobal: true,
endPoint: 'play.min.io',
port: 9000,
useSSL: true,
accessKey: 'Q3AM3UQ867SPQQA43P2F',
secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
}),
],
})
export class NestMinioClientModule {}
Then you can use it in the controller or service by injecting it in the controller as:
constructor(@Inject(MINIO_CONNECTION) private readonly minioClient) {}
Multiple Clients In One Module
You can register multiple MinIO clients by importing NestMinioModule.register(...) multiple times and assigning a unique name to each client.
import { Module } from '@nestjs/common';
import { NestMinioModule } from 'nestjs-minio';
@Module({
imports: [
NestMinioModule.register({
name: 'uploads',
endPoint: 'localhost',
port: 9000,
useSSL: false,
accessKey: 'test',
secretKey: 'test1234',
}),
NestMinioModule.register({
name: 'archive',
endPoint: 'localhost',
port: 9001,
useSSL: false,
accessKey: 'archive-user',
secretKey: 'archive-pass',
}),
],
})
export class StorageModule {}
Inject named clients using the decorator:
import { Controller } from '@nestjs/common';
import { Client } from 'minio';
import { InjectMinio } from 'nestjs-minio';
@Controller()
export class FilesController {
constructor(
@InjectMinio('uploads') private readonly uploadsClient: Client,
@InjectMinio('archive') private readonly archiveClient: Client,
) {}
}
Connection Teardown
NestMinioService exposes manual teardown methods so applications can proactively close MinIO connections during graceful shutdown:
import { Injectable } from '@nestjs/common';
import { NestMinioService } from 'nestjs-minio';
@Injectable()
export class ShutdownService {
constructor(private readonly minioService: NestMinioService) {}
async closeMinio(): Promise<void> {
await this.minioService.disconnect();
}
}
The module also performs this cleanup automatically on application shutdown.
Quick Start Example - File Uploader
This example program connects to an object storage server, makes a bucket on the server and then uploads a file to the bucket.
We will use the MinIO server running at https://play.min.io in this example. Feel free to use this service for testing and development. Access credentials shown in this example are open to the public.
import { Controller, Get, Inject } from '@nestjs/common';
import { MINIO_CONNECTION } from '../constants';
import {Client, InjectMinio} from 'minio';
@Controller()
export class NestMinioClientController {
constructor(@Inject(MINIO_CONNECTION) private readonly minioClient: Client) {}
@Get()
index() {
const file = '/tmp/app.zip';
const metaData = {
'Content-Type': 'application/octet-stream',
'X-Amz-Meta-Testing': 1234,
example: 5678,
};
this.minioClient.fPutObject(
'europetripxxx3',
'app.zip',
file,
metaData,
function(err, etag) {
if (err) {
return console.log(err);
}
console.log('File uploaded successfully.');
},
);
}
}