One week with Nest.js, is it good?
Tags: typescript, beginners, codenewbie, node
Published: 2021-03-29 18:39:15

If you are interested in reading this article in Spanish, check out my blog:
[The Developer's Dungeon](https://www.patferraggi.dev/blog/2021/mar/nestjs-esta-bueno/)

Hey guys, how you been? me? I have been working a lot on a new project I am building with the help of a friend, I will not discuss the details here but you will probably hear me talk about it very soon. Today I want to speak about one of the technology selections I made for building this project.

I wanted to build an API, using node, using TypeScript. I have heard a lot of great things from this backend framework called [Nest.js](https://nestjs.com/) but I hadn't tried it myself. Now after a week of coding the API, having several endpoints, authenticating, connecting to a database, and stuff I will give you my honest review. But let's start from the beginning.

-----

## What is Nest.js?

From the documentation itself we get this answer: 

> A progressive Node.js framework for building efficient, reliable, and scalable server-side applications.

That doesn't say much right? well in my own words, Nest.js is a Node.js framework built on top of [express.js](https://expressjs.com/) and [TypeScript](https://www.typescriptlang.org/) that comes with a strong opinion on how API's should be built. Since it is very opinionated it provides a structure, a CLI, and an almost infinite amount of tools that let you create professional APIs very very fast.

I guess it would be like Django for Python or asp.net Core for C#.

## What is it like? 

Well, as with most API frameworks, Nest.js defines endpoints through an entity called `Controller`.

```typescript

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }

  @Get(":id")
  findOne(@Param('id') id:string): string {
    return 'This action returns one cat';
  }
}
```

For me, coming from C#, to see this in the JavaScript is just a pleasure. But I guess it can be daunting for you noders out there, so let me explain all the goodies that are happening in the previous example.

This `Controller` will create 2 endpoints in the routes `{url}/cats` and `{url}/cats/{id}`, the id in the URL of the second endpoint will be automatically mapped to the id parameter in the method. 
These types of tags `@Get()` are called decorators and there are a bunch of them, you can use them for defining the HTTP method, for getting properties, for defining authentication, basically whatever you feel like.

**But where do you write your business logic? you might ask.** Well Nest.js got you covered, for that you will use an entity called `Service`

```typescript
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}
```

Nothing too weird here, except, what is that `@Injectable` decorator doing?. Nest.js comes with `Dependency Injection` by default, this decorator defines which dependencies can be injected into other components through their constructors.

**This seems like is gonna generate a lot of code, is there an easy way to manage dependencies?** yes, there is. You can pack functionality together by using Modules, they are like Node Modules but in Nest.js you can hold controllers, services, and more inside one Module that represent a feature, then inject that entire module into others to be used there.

```typescript
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}
```

**I don't see any mention of how to contact a database, is there something for that?**. Didn't I tell you that Nest.js is pretty opinionated? as such, it comes with a way of working with databases. Enters [TypeORM](https://typeorm.io/#/). 

Instead of doing SQL queries manually, we use an Object Relational Model, for working with the database, we define database entities that later will be used for creating the tables on the application startup and use automatic `Repositories` created based on our database model.

```typescript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Cat {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column('text')
  color: string;
}
```


## Seems super complicated, who is it for?

I would lie if I say that everyone who starts messing with Nest.js is going to be productive immediately. 

- Nest.js follows a pattern that is very Object-Oriented, which is not something we see very often in the JavaScript world.
- If you only know dynamically typed languages is gonna be hard doing a switch because of TypeScript.

On the other hand, if you come from a language like C#, then TypeScript is gonna feel right at home(they were actually designed by the same guy). On top of that, you probably used a framework like asp.net Core so you know exactly what a `Controller` is, you probably created a layered architecture and used the word `Service` to define your business logic even before seeing a single line of Nest.js code.

**But, I have never done any backend, can I take Nest.js as my first project?** It depends.

Nest.js is gonna be easier for you if you come from Angular instead of React.

The entire Module, Dependency Injection, Decorator architectural patterns that Nest.js uses is heavily inspired in Angular, they are like cousins, and if you come from Angular you will already know TypeScript so picking up Nest.js will be a no brainer.

-----

## Conclusion

You probably know that I gonna say I really like Nest.js, well yeah, it seems like a great framework to create reliable node.js APIs. It provides tons of functionality out the box, and if you wanna do something special, their documentation is just outstanding. If you come from one of the backgrounds I mentioned previously or you just want to learn something new I would definitely recommend you to give Nest.js a try 🤞.

As always, if you liked this post go ahead and share it, have you tried Nest.js? Do you want to know something specific? let me know below in the comments :smile: