NodeJS template

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

A continuación te explico como usar una plantilla hecha con NodeJS para tus proyectos. Esta plantilla tiene las siguientes características:

  • Programación funcional.
  • Enfocada para hacer API Rest.
  • Soporte para web sockets.
  • Soporte para swagger.

Para instalarla:

npx degit monteserin/nodejs-template

API REST Controller

Sus peticiones se gestionan en ./src/controllers/api/users/index.js

Ejemplo de petición:

router.delete("/:id", restrictedAccess,asyncHandler( async (req, res) => {
  const { params: { id } } = req;
  await UsersModel.deleteUser(id);
  res.send(`User id: ${id} deleted`);
}));

asyncHandler

Se encarga de evitar que el servidor se caiga cuando se produzca una excepción (en nuestro caso usamos Heroku, aunque en local usemos nodemon y no se caerá).

Por otra parte, también nos evita tener que repetir el código de manejo de errores (try, catch) para cada petición. Sólo hará falta escribir dicho código dentro del asyncHandler.

El siguiente código:

app.get("/", asyncHandler(async (req, res) => {
    res.seeeend("va bien la cosaa"); 
}));

daría un error que sería gestionado aquí:

./src/middlewares/error-handler.js

export const asyncHandler = controller => (req, res, next) => Promise
  .resolve(controller(req, res, next))
  .catch((err) => {
    console.error('Request error:' + err.toString());
    if (err) return res.sendStatus(500).send();
});

swagger

Podemos acceder a la documentación de la api REST (Swagger) mediante el path /docs.

Model

Sus métodos se gestionan en ./src/models/users/index.js.

export const deleteUser = id => UserSchema.destroy({ where: { id }});

Y su estructura en ./src/models/users/schema.js

import { db } from '../../database';
const { DataTypes } = require('sequelize');

const User = db.define('user', {
	password: DataTypes.STRING,
	username: DataTypes.STRING,
});

export default User;

Generación del modelo en la base de datos al arrancar la aplicación

Debemos cargar un controlador que a su vez cargue el modelo que cuya estructura queremos persistir.

./src/controllers/index.js

export default function (app) {

  app.use('/plays', PlaysController);

./src/controllers/plays/index.js

import * as PlaysModel from "@Models/plays";

Regenerar la base de datos

Muchas veces, como consecuencia de haber modificado nuestro modelo de datos, necesitaremos borrar la base de datos para que las tablas vuelvan a generarse. Esto nunca debe hacerse en producción. Para forzar el borrado de las tablas al arrancar la aplicación, usaremos {force: true}

./src/database/index.js

export default async (onConnect) => {
	try {
        await db.authenticate();
        db.sync({ force: true});
        ...

Conexión a la base de datos:

Está en ./src/config/database.js:

export default {
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'amor',
    connectionLimit : 10,
};

Pasos a seguir al crear una nueva entidad:

1. Duplicamos el controlador de User.

2. Duplicamos el modelo de User.

3. Modificamos el modelo para que maneje la entidad correcta.

4. Modificamos el controlador para que cargue el modelo correcto y maneje el modelo correcto.

5. Modificamos el Swager (sobre todo las rutas).

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.