Provides an injectable service with client to provide S3 (AWS) and GS (Google Storage) storage access from nestjs modules
@gcoreplus/nestjs-storage
implements a module, NSStorageModule
, which when imported into
your nestjs project provides an S3 and GS client to any class that injects it. This
lets S3 and GS be worked into your dependency injection workflow without having to
do any extra work outside of the initial setup.
-
General
npm install --save @gcoreplus/nestjs-storage
-
AWS (Optional)
npm install --save aws-sdk
-
Google Storage (Optional)
npm install --save @google-cloud/storage
The simplest way to use @gcoreplus/nestjs-storage
is to use NSStorageModule.forRoot
import { Module } from '@nestjs-common';
import { NSStorageModule } from '@gcoreplus/nestjs-storage';
@Module({
imports: [
NSStorageModule.forRoot({
id?: '<projectid>',
s3: {
accessKeyId: 'AWS_ACCESS_KEY_ID',
secretAccessKey: 'AWS_AWS_SECRET_ACCESS_KEY',
region?: 'AWS_REGION_ID',
sessionToken?: 'AWS_SESSION_TOKEN', | null,
apiVersion?: 'S3_API_VERSION', //based on s3 api version //
buckets?: [
{ id: 'bucket-a', name: 'Bucket_A' },
]
}
}),
],
})
export class AppModule {}
The async way @gcoreplus/nestjs-storage
is to use NSStorageModule.forRootAsync
import { Module } from '@nestjs-common';
import { NSStorageModule } from '@gcoreplus/nestjs-storage';
import { ConfigModule } from '@gcoreplus/nestjs-config';
import { ConfigService } from '@gcoreplus/nestjs-config';
@Module({
imports: [
NSStorageModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (cfg:ConfigService) => ({
id: 'MyProjectS3',
s3: {
accessKeyId: cfg.get('ACCESS_KEY_ID'),
secretAccessKey: 'AWS_SECRET_ACCESS_KEY',
buckets: [
{ id: 'bucket-a', name: 'Bucket_A' },
]
},
}),
inject: [ConfigService],
})
]
})
export class AppModule {}
You can then inject the S3 client into any of your injectables by using a custom decorator
import { Injectable } from '@nestjs/common';
import { NSBody, NSBucket, NSPutObjectRequest, createBucketToken, NSService, NSProvider } from '@gcoreplus/nestjs-storage';
@Injectable()
export class AppService {
public constructor(@NSProvider() private readonly service: NSService) { }
async upload(pdf: NSBody) {
try {
const bucket: NSBucket | undefined = this.service.getNSBucketByKey(createBucketToken('MyProjectS3', 'Bucket_A'));
if (bucket) {
const params: NSPutObjectRequest = {
Key: 'file_name.pdf',
ACL: 'public-read',
Body: pdf,
};
await bucket.putObject(params);
}
} catch (error) {
console.log('ERROR S3 FILE UPLOAD => ', error);
}
}
}
Distributed under the ISC License. See LICENSE
for more information.
Copyright © 2020 gcoreplus Inc.