CRUD en NestJS
¡Claro! Vamos a construir un CRUD en NestJS paso a paso, desde cero y de forma sencilla. Usaremos PostgreSQL (con TypeORM) como base de datos, pero puedes adaptarlo a MySQL o SQLite si prefieres.
📌 Paso 1: Instalación y Configuración
1. Instalar NestJS CLI (si no lo tienes):
npm install -g @nestjs/cli2. Crear un nuevo proyecto:
nest new proyecto-crud
cd proyecto-crud3. Instalar TypeORM y PostgreSQL:
npm install @nestjs/typeorm typeorm pg4. Configurar la base de datos
Edita src/app.module.ts:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'tu_usuario',
password: 'tu_contraseña',
database: 'nest_crud',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true, // ¡OJO! Solo para desarrollo.
}),
],
})
export class AppModule {}📌 Paso 2: Crear una Entidad (Modelo)
Vamos a crear una entidad Product (producto).
Crea src/products/product.entity.ts:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
price: number;
@Column()
description: string;
}📌 Paso 3: Crear un Módulo, Servicio y Controlador
1. Generar el módulo de productos:
nest generate module products
nest generate service products
nest generate controller products2. Configurar el módulo (src/products/products.module.ts):
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './product.entity';
import { ProductsService } from './products.service';
import { ProductsController } from './products.controller';
@Module({
imports: [TypeOrmModule.forFeature([Product])],
providers: [ProductsService],
controllers: [ProductsController],
})
export class ProductsModule {}📌 Paso 4: Implementar el CRUD en el Servicio
Edita src/products/products.service.ts:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Product } from './product.entity';
@Injectable()
export class ProductsService {
constructor(
@InjectRepository(Product)
private productRepository: Repository<Product>,
) {}
// CREATE
async create(product: Product): Promise<Product> {
return this.productRepository.save(product);
}
// READ (ALL)
async findAll(): Promise<Product[]> {
return this.productRepository.find();
}
// READ (ONE)
async findOne(id: number): Promise<Product> {
return this.productRepository.findOne({ where: { id } });
}
// UPDATE
async update(id: number, product: Product): Promise<void> {
await this.productRepository.update(id, product);
}
// DELETE
async remove(id: number): Promise<void> {
await this.productRepository.delete(id);
}
}📌 Paso 5: Implementar el Controlador
Edita src/products/products.controller.ts:
import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { ProductsService } from './products.service';
import { Product } from './product.entity';
@Controller('products')
export class ProductsController {
constructor(private readonly productsService: ProductsService) {}
@Post()
create(@Body() product: Product): Promise<Product> {
return this.productsService.create(product);
}
@Get()
findAll(): Promise<Product[]> {
return this.productsService.findAll();
}
@Get(':id')
findOne(@Param('id') id: number): Promise<Product> {
return this.productsService.findOne(id);
}
@Put(':id')
update(@Param('id') id: number, @Body() product: Product): Promise<void> {
return this.productsService.update(id, product);
}
@Delete(':id')
remove(@Param('id') id: number): Promise<void> {
return this.productsService.remove(id);
}
}📌 Paso 6: Probar la API con Postman o cURL
1. Iniciar el servidor:
npm run start:dev2. Endpoints disponibles:
| Método | Ruta | Descripción |
|---|---|---|
| POST | /products | Crear producto |
| GET | /products | Obtener todos |
| GET | /products/:id | Obtener uno |
| PUT | /products/:id | Actualizar producto |
| DELETE | /products/:id | Eliminar producto |
Ejemplo con cURL:
# Crear producto
curl -X POST -H "Content-Type: application/json" -d '{"name":"Laptop", "price":999, "description":"Una laptop potente"}' http://localhost:3000/products
# Obtener todos
curl http://localhost:3000/products
# Obtener uno
curl http://localhost:3000/products/1
# Actualizar
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Laptop Pro"}' http://localhost:3000/products/1
# Eliminar
curl -X DELETE http://localhost:3000/products/1🎉 ¡Listo!
Ahora tienes un CRUD completo en NestJS con PostgreSQL. Si quieres profundizar, puedes agregar:
Validación de datos (
class-validator).Manejo de errores personalizados.
Autenticación (JWT).
Comentarios
Publicar un comentario