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.

  1. Recordas que el servicio era un injectable? Eso nos permite traerlo a través de una función constructora dentro de la clase TasksController.
  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.

  1. Tenemos que guardar esto en alguna variable. La instanciamos y le decimos que taskService va a ser una variable del tipo TasksService
export class TasksController {
  taskService: TasksService;
  1. Listo la primera parte, ya el servicio está instanciado dentro del controlador. Ahora vayamos a ejecutarlo. Debemos crear una funcion que dentro retorne el servicio.
  @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();
  }
}