Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Estructura de aplicaciones en NestJS

3/23
Recursos

NestJS posee desde el inicio de un proyecto varios directorios y archivos que se generan por defecto al crearlo. Veamos para que te sirve cada uno.

Aplicaciones y carpetas de NestJS

De arriba hacia abajo:

1. Node_modules:

Todo proyecto de Javascript posee este directorio donde se almacenan las librerías y dependencias que se descarguen con NPM.

2. SRC:

Directorio principal del proyecto donde encontramos:

  • app.controller.spec.ts: archivo de pruebas unitarias del controlador con el mismo nombre.
  • app.controller.ts: controlador que contiene endpoints a diferentes recursos.
  • app.module.ts: módulo principal de toda la aplicación NestJS.
  • app.service.ts: servicio consumido por los controladores para determinados propósitos.
  • main.ts: archivo Core de la aplicación NestJS donde se realizan configuraciones e imports básicos para su funcionamiento.

3. Test:

Directorio de pruebas unitarias y de integración. NestJS utiliza por defecto Jest para escribir las pruebas.

  • .editorconfig: este archivo no viene por defecto, pero se recomienda crearlo e instalar el plugin con el mismo nombre en el editor. Permite autoformatear los archivos, espacios, indentación, etc.
  • .eslintrc.js: permite la configuración de un analizador de código para detectar tempranamente errores y resolverlos. Requiere instalación de un plugin en el editor.
  • .gitignore: indicarle a GIT qué archivos/directorios ignorar.
  • .prettierrc: archivo de configuración para el autoformateo de código. Requiere instalación de un plugin en el editor.
  • nest-cli.json: archivo con configuraciones de NestJS. Algunos plugins del framework requieren de configuraciones adicionales en este archivo.
  • package-lock.json: describe las dependencias exactas que se generaron en la instalación del proyecto.
  • package.json: archivo para el manejo de dependencias, scripts y metadatos relevantes para el proyecto.
  • README.md: archivo markdown para la documentación del proyecto.
  • tsconfig.build.json: archivo principal para la configuración de TypeScript.
  • tsconfig.json: extensión con más configuraciones de TypeScript.

Poco a poco irás conociendo la funcionalidad de cada archivo. ¡No te preocupes y continuemos!

Archivo ./editorconfig

# ./editorconfig
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

Contribución creada por: Kevin Fiorentino.

Aportes 18

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Archivo ./editorconfig

# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false

Algo a resaltar, es que NestJs/CLI te inicializa también un repositorio, pero lo hace creando la rama principal como master.
.
Esto puede ser un problema si queremos subir nuestro repositorio a plataformas como GitHub, ya que en ellos la rama principal es main.
.
La solución es muy sencilla, solo debes hacer commit de los archivos, y después cambiar el nombre de la rama con el siguiente comando

git branch -m master main

Y listo, podrás subir tu proyecto a GitHub sin problema 😉

Estructura de archivos de Nest.js:

/
Nest.js trae muchas carpetas y archivos cuya finalidad es configurar todo lo que nuestro proyecto de backend necesitaría sin tener que configurarlo nosotros. Entre todos los archivos y carpetas generados, los principales son:
/

  • La carpeta dist donde se encuentra todo el código que enviaremos a producción.
    /

    /
  • La carpeta src donde crearemos nuestro proyecto backend en sí.
    /

    /
  • El archivo package.json dentro del cual se encuentran todos los comandos y dependencias que utiliza Nest.js.
    /

    /
  • El archivo tsconfig.json dentro del cual se encuentra toda la configuración de TypeScript que necesita nuestro proyecto.
    /
Para solucionar el error en rojo "Delete CR" que marca el editor en los archivos TS, pueden añadir la siguiente línea al archivo de configuración de prettier (".prettierrc") ``` "endOfLine": "auto" ```
Me sale un error en rojo en el editor en los archivos TS que dice 'Delete CR' saben como quitarlo?![](https://static.platzi.com/media/user_upload/image-69155072-8cb3-494c-86ef-b0d7235a4928.jpg) '
Si te aparece el error 'Disable prettier/prettier problem' en los archivos ts, puedes configurar el archivo '.eslintrc.js' comentando la siguiente linea de código que se encuentra en 'extends': ```js 'plugin:prettier/recommended', ```

Wow si no hubiera visto los 3 cursos anteriores de Typescript estaria muy perdido

crear archivo .editorconfig

Genial esta clase, me gusto como nest una nos implementa una plantilla completa con las configuraciones necesarias

Configuración Manual

Entendiendo como opera el CLI para una generación limpia de NestJS, de seguro notaron la generación absurda de archivos que puede que genere mucha distracción.
.
Por ello, les presento una configuración alternativa que permitirá minimizar y dar una vista diferente para nuestro pool de cursos de NestJS.
.

Enlace al ⴵ Repositorio GitHub.

.

Instalación de dependencias

Nota. En mi caso, he preferido pnpm por npm por sentido de performance a medida en que se va escalando un proyecto.

.
NestJS posee como dependencias core aquellas que están citadas en la documentación como deseables. Sin embargo, deja abierta la configuración para soportar el transporte de información, por ejemplo express.
.
En fin, instalaremos las siguientes:

# pnpm
pnpm init -y
pnpm i @nestjs/{common,core,platform-express} reflect-metadata rxjs
pnpm i -D source-map-support

# npm
npm init -y
npm i @nestjs/{common,core,platform-express} reflect-metadata rxjs
npm i -D source-map-support

Note que se preferirá express para la creación de un servidor REST.

.
Posteriormente, anexamos el script necesario para lanzar NestJS en modo “watch” (desarrollo):

{
	"name": "nestjs-project",
	"version": "0.0.0",
	...
	"scripts": {
		"dev": "nest start --watch"
	}
	...
}

.

Estructura de carpetas

Después de haber instalado y escrito nuestro script para desarrollo, pasamos a configurar nuestros primeros archivos de nuestro servidor. Dicho servidor, tendrá la siguiente estructura:

- src
└─⫸ controllers
|	└─⫸ app.controller.ts
|
└─⫸ modules
|	└─⫸ app.module.ts
|
└─⫸ services
|	└─⫸ app.service.ts
|
└─⫸main.ts

Donde cada archivo será como está establecido como “Hello World”.

// app.controller.ts
import { Controller, Get } from '@nestjs/common'
import { AppService } from '../services/app.service'

@Controller()
export class AppController {
    constructor(private readonly appService: AppService) {}

    @Get()
    getHello(): string {
        return this.appService.getHello()
    }
}
// app.module.ts
import { Module } from '@nestjs/common'
import { AppController } from '../controllers/app.controller'
import { AppService } from '../services/app.service'

@Module({
    imports: [],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}
// app.service.ts
import { Injectable } from '@nestjs/common'

@Injectable()
export class AppService {
    getHello(): string {
        return 'Hello World 🤙'
    }
}
// main.ts
import { NestFactory } from '@nestjs/core'
import { AppModule } from './modules/app.module'

;(async () => {
    const app = await NestFactory.create(AppModule)
    await app.listen(3000)
})()

.

Configuración de lenguaje

Para este punto, nos faltaría configurar la elección del lenguaje (JavaScript o TypeScript). Así como también NestJS CLI.
.
Para nuestro proyecto, será en TypeScript por lo que anexaremos nuestros archivos de TypeScript para desarrollo y compilación. Por lo que instalaremos nuestras dependencias:

#pnpm
pnpm i -D @types/node ts-node typescript
# npm
npm i -D @types/node ts-node typescript

.
Y configuramos nuestros archivos de la siguiente manera:

// tsconfig.build.json
{
    "extends": "./tsconfig.json",
    "exclude": ["test/**/*.test.ts", "debug/**/*.ts", "./package.json"]
}
// tsconfig.json
{
    "compilerOptions": {
        "target": "ES2021",
        "module": "commonjs",
        "outDir": "./dist",
        "strict": true,
        "esModuleInterop": true,
        "skipLibCheck": true,
        "forceConsistentCasingInFileNames": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "resolveJsonModule": true,
    },
    "include": ["./src/**/*", "test/**/*"]
}

Nota. Si gustas revisar el archivo de configuración, me he basado en proyectos pasados. Sin embargo, te recomiendo buscar cada elemento en la 🔗 referencia de documentación.

.
Finalmente nuestro archivo de configuración de NestJS nest-cli.json:

{
    "$schema": "https://json.schemastore.org/nest-cli",
    "collection": "@nestjs/schematics",
    "sourceRoot": "src"
}

¡Rock n’ Roll! 🤟

excelente lo del editor!

Para los que no sepan cómo funciona .editorconfig esto es lo que pude notar

Al declarar una función en VSCode con el archivo .editorconfig sin haber instalado la extensión de EditorConfig tuve lo siguiente:

function name(params:type) {
    // 4 Espacios
}

Obsérvese que en donde comienza el código, VSCODE elige que mi indentación será de 4 espacios, además de que cada que presione la tecla TAB vscode hará 4 espacios. Esto es porque a pesar de tener el archivo .editorconfig no tengo la extensión requerida, así que no está funcionando

Después de instalar la extención de VSCODE declaré una función y obtuve lo siguiente:

function Suma(params:type) {
  // 2 Espacios
}

Ahora la extensión EditorConfig me ayuda a hacer código con las especificaciones necesarias

Esta propiedad no existe en editorConfig ```
quote_type = single

excelente

Estructura de de la aplicacion:

  • Dependencias del proyecto package.json
"dependencies": {
    "@nestjs/common": "^7.6.15",
    "@nestjs/core": "^7.6.15",
    "@nestjs/platform-express": "^7.6.15",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^6.6.6"
}
  • el archivo .eslintrc.js tiene la configuracion del linter para que nuestro codigo sea entendible y los demas puedas leer facilmente.
module.exports = {
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: 'tsconfig.json',
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint/eslint-plugin'],
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  root: true,
  env: {
    node: true,
    jest: true,
  },
  ignorePatterns: ['.eslintrc.js'],
  rules: {
    '@typescript-eslint/interface-name-prefix': 'off',
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    '@typescript-eslint/no-explicit-any': 'off',
  },
};
  • el archivo nest-cli.json tiene la forma que ejecuta el cli de nest nuestro proyecto. No se suele editar mucho, solo para unos plugins en particular.
{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src"
}
  • Crea un README.md sencillo
  • tsconfig.json viene con la config adecuada para que transpile el codigo de ts a js
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  }
}
  • La carpeta mas importante src donde vamos a trabajar, creando servicios, clases, componentes, etc
  • .editorconfig pone la config para que todos manejemos el mismo estandar sin importar el editor que usemos.
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false
Desde que abri el proyecto me marco error en el main. Muestra un mensaje que me dice que tengo que eliminar el prettier "Delet eslint(prettier/prettier)" alguien sabe como arreglar este error? ![](https://static.platzi.com/media/user_upload/image-e960e494-0000-4439-9c8a-314b150936ef.jpg)

Excelente.