En la clase sobre controladores, viste que podes hacer funciones dentro del controlador. Si esas funciones se van a repetir en varios controladores o podes pensar una forma de hacerlas reutilizables a la hora de refactorizar el código, podes crear un servicio para eso. La generas desde la terminal con el comando
nest generate service nombreDelModulo
Una vez que lo ejecutas te debería crear un archivo con el servicio y otro con las herramientas de testing. El archivo del servicio se debería ver así
import { Injectable } from '@nestjs/common';
@Injectable()
export class TasksService {}
Demosle una tarea, es decir una funcion que diga el mensaje de que se están trayendo tareas del backend
import { Injectable } from '@nestjs/common';
@Injectable()
export class TasksService {
getTasks() {
return 'El backend está trayendo tareas';
}
Ahora tenemos que importarla en el controlador de nuestro módulo. Prestá atención a este código y a la explicación porque es quizas algo dificil de entender al principio.
import { TasksService } from './tasks.service';
@Controller('tasks')
export class TasksController {
taskService: TasksService;
constructor(taskService: TasksService) {
this.taskService = taskService;
}
@Get()
getAllTasks() {
return this.taskService.getTasks();
}
}
Es una forma un poco compleja y de mucho texto pero vamos a tratar de separarla parte por parte.
constructor(taskService: TasksService) {
this.taskService = taskService;
}
Le pasamos como argumento un taskService que va a ser del tipo TasksServices (el servicio que creamos) y le decimos que taskService va a ser igual al taskService que recibe el constructor.
export class TasksController {
taskService: TasksService;
@Get()
getAllTasks() {
return this.taskService.getTasks();
}
Veamos otro ejemplo suponiendo que queremos pasar un array de datos que manejamos desde el propio servicio
import { Injectable } from '@nestjs/common';
@Injectable()
export class TasksService {
private tasks = [
{
id: 1,
task: 'Tarea de prueba 1',
},
{
id: 1,
task: 'Tarea de prueba 2',
},
];
getTasks() {
return this.tasks;
}
}
Genial. Ahora esto te va a llamar la atencion. Te acordás de la forma media complicada de llamar a los servicios? Podemos reducirla un poco
import { TasksService } from './tasks.service';
@Controller('tasks')
export class TasksController {
constructor(private taskService: TasksService) {}
@Get()
getAllTasks() {
return this.taskService.getTasks();
}
}