4 min. de lectura (aproximado)

Crear fichero de rutas con NodeJS

(4 min. de lectura) En el post sobre como crear un servidor con NodeJS hay un ejemplo de una ruta usando Express, que para refrescar sería:

const express = require('express');
const app = express();
// Define una ruta básica
app.get('/', (req, res) => {
res.send('¡Hola, mundo! Este es mi servidor con Express');
});

app.get('/despedida', (req, res) => {
res.send('¡Adiós, mundo!');
});
// Define el puerto
const PORT = 3000;

// Inicia el servidor
app.listen(PORT, () => {
console.log(`Servidor corriendo en http://localhost:${PORT}`);
});
Con este ejemplo si se pone en el navegador la url: "http://localhost:3000/", mostrará hola mundo '"¡Hola, mundo! Este es mi servidor con Express"', pero se pone en el navegador la url: "http://localhost:3000/despedida", mostrará hola mundo '"¡Adiós, mundo!"'.
Lo ideal es tener las rutas en un fichero aparte, como con las rutas en laravel.
Para crear un fichero de rutas en NodeJS y luego usarlas hay que hacer lo siguiente: Primero sería crear un fichero donde se almacenarán las rutas, por ejemplo, "/rutas/rutasProyecto.js", dicho fichero contendrá lo siguiente:

onst express = require('express');
const router = express.Router();

//Cargo el controlador

const articulosController = require("../controllers/articulos");

//Definir rutas
router.get('/list-articles',articulosController.getAllArticles);
router.get('/articleById/:id',articulosController.getArticleById);

//exportar rutas
module.exports = router;
Y para usar dichas rutas, tendremos que ir al fichero principal del proyecto de NodeJS y se hará lo siguiente:

//Rutas
const rutasNode =  require('./rutas/rutasProyecto');
app.use("/api",rutasNode);
En el ejemplo anterior se importa el fichero donde se encuentran las rutas. Luego con la linea "app.use("/api",rutasNode);" se añade el prefiero "api", o lo que se quiera, y con "rutasNode", se usarán las rutas definidas en ese fichero.
En el ejemplo del fichero de rutas hace referencia al "articulosController" que es una clase que hace de controlador y tiene varios métodos, en este ejemplo solo llama a "getAllArticles" y "getArticleById". Pongo el código de la clase de los articulos:

const fs = require("fs");
const path = require("path");
const Article = require('../models/articulo');

const ArticleController = {
  getImage(req, res) {

let file = req.params.file;
let filepath = "./uploads/images/" + file;
console.log(filepath);
//comprobar si existe el fichero
fs.stat(filepath, (error,exists) =>  {
if (!error && exists){
  return res.sendfile(path.resolve(filepath));
}else{

 return res.status(404).send({
  status: 'error',
  data: 'imagen no existe',
  file: req.file
 });
}
});
 
  }, 
  uploadImage(req, res) {

 let param = req.param.id;
 
 if (!req.file){
 return res.status(404).json({
 status: 'error',
 data: 'No se ha subido ningun archivo',
});
 }
 const filepath = req.file.path;
 //obtiene la extension del sin punto
 const extension = path.extname(req.file.originalname).toLocaleLowerCase().replace(".",");

 const validExtension = ["jpg","jpeg","gif","png"];
 if (!validExtension.includes(extension)){
//Borra el fichero subido
fs.unlinkSync(filepath);
return res.status(404).json({
 status: 'error',
 data: 'Archivo no es imagen',
});
 }

 return res.status(200).json({
status: 'success',
data: 'todo bien',
file: req.file
 });
  },  
  // Obtener todos los artículos
  async getAllArticles(req, res) {
try {
 const articles = await Article.getAll();
 console.log('Artículos en la base de datos:');
 console.table(articles);
 return res.status(200).json({
status: 'success',
data: articles
 });
} catch (err) {
 console.error('Error en getAllArticles:', err);
 return res.status(500).json({
status: 'error',
message: 'Error al obtener los artículos',
error: err.message
 });
}
  },

  // Obtener un artículo por ID
  async getArticleById(req, res) {
const { id } = req.params;
try {
 const article = await Article.getById(id);
 if (!article) {
return res.status(301).json({
 status: 'error',
 message: `Artículo con ID ${id} no encontrado`
});
 }
 console.log('Artículo encontrado:');
 console.table([article]);
 return res.status(200).json({
status: 'success',
data: article
 });
} catch (err) {
 console.error('Error en getArticleById:', err);
 return res.status(500).json({
status: 'error',
message: 'Error al obtener el artículo',
error: err.message
 });
}
  }
};
module.exports = ArticleController;
En el ejemplo anterior hay más métodos pero solo nos interesan dos. Para probar con postman o con el navegador solo basta con poner las urls: "http://localhost:3977/api/articleById/10" y "http://localhost:3977/api/list-articles", como está definido en el ejemplo del fichero de rutas. Lo que ha cambiado es que ahora pone "api", o lo uqe se haya definido en "app.use("/api",rutasNode);"" y antes no se había puesto.