Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can we use all node npm packages in Nestjs

In current, I am learning Nestjs, I found that Nestjs have a list of its own npm package like @nestjs/cqrs, @nestjs/jwt etc. Full list of all packages is https://www.npmjs.com/org/nestjs. Now I have a doubt that can we use all npm packages in nestjs that we use in any Node.js application like morgan, windston etc. Or we can only use the packages that mention in nestjs documentation list.

like image 550
Pankaj Kumar Choudhary Avatar asked Aug 08 '19 02:08

Pankaj Kumar Choudhary


2 Answers

First, node.js packages can be used in Nestjs with its custom provider. So see the current docs.

Second, Brunner on the Nestjs core team helped me with this on the Nestjs_framework Reddit. He made a nice brief example for us on Github. I asked him to change the name from reddit to node so that will break this link, but you can find it on his Github site. He deserves the credit.

We aren't supposed to link to a solution on SO. So let's get started.

Brunner changed my architecture and I like his approach. I wanted to use the Cloudinary Node SDK which doesn't have a Nestjs module. This should work for importing any Node package, at least that is my understanding.

Note: When you write this.cloudinary. you expect to see a list of methods after that '.' . You won't, so just use whatever code the SDK or package docs tells you to use. A little weirdness.

The Cloudinary components live in a folder inside my members directory, which has a bunch of modules imported into it.

cloudinary.module.ts

import { Module } from '@nestjs/common';
import { cloudinaryProvider } from './cloudinary.provider';
import { CloudinaryService } from './cloudinary.service';

@Module({
  providers: [cloudinaryProvider, CloudinaryService],
  exports: [cloudinaryProvider],
})

export class CloudinaryModule {}

cloudinary.provider.ts

import { Provider } from '@nestjs/common';
import * as CloudinaryLib from 'cloudinary';

export const Cloudinary = 'lib:cloudinary';

export const cloudinaryProvider: Provider = {
  provide: Cloudinary,
  useValue: CloudinaryLib,
};

cloudinary.service.ts

import { Injectable, Inject } from '@nestjs/common';
import { Cloudinary } from './cloudinary.provider';

@Injectable()
export class CloudinaryService {

  constructor(
    @Inject(Cloudinary) private cloudinary
  ) {
    // console.log('This is the cloudinary instance:');
    // console.log(this.cloudinary);
  }
}

And finally the parent module:

members.module.ts

import { CloudinaryModule } from './cloudinary/cloudinary.module'

@Module({
  imports: [
    CloudinaryModule,
    ...
like image 162
Preston Avatar answered Sep 28 '22 00:09

Preston


Nest will expose the http adapter so that you can hook into it, here is an example using the morgan & body-parser npm package:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from './config/config.service';
import { ConfigModule } from './config/config.module';
import bodyParser from 'body-parser';
import morgan from 'morgan';

async function bootstrap() {

    const app = await NestFactory.create(AppModule);
    const configService = app.select(ConfigModule).get(ConfigService);

    app.use(bodyParser.json());
    app.use(morgan('dev'));
    app.enableCors();

    await app.listen(configService.PORT, () => console.log(`Server listening on port ${configService.PORT}`));
}

bootstrap();

In this instance above appis an express instance.

like image 20
nerdy beast Avatar answered Sep 28 '22 00:09

nerdy beast