¡Es mejor no usarlo en absoluto! Lo explico, y eso es lo que hago también lo explico.
La función next () que puede tener cualquier nombre y, por convención, se ha establecido en next. Está indirectamente relacionado con las operaciones (PUT, GET, DELETE, ...) que generalmente se realizan en el mismo recurso URI, por ejemplo/ user /: id
app.get('/user/:id', function (req,res,next)...)
app.put('/user/:id', function (req,res,next)...)
app.delete('/user/:id', function (req,res,next)...)
app.post('/user/', function ()...)
Ahora, si observa app.get, app.put y app.delete usan la misma uri (/ user /: id), lo único que las diferencia es su implementación. Cuando se realiza la solicitud (req) express coloca la solicitud primero en app.get, si falla cualquier validación que haya creado porque esa solicitud no es para ese controlador, pasa la solicitud a app.put que es la siguiente ruta en el archivo y así en. Como se ve en el ejemplo a continuación.
app.get('/user/:id', function (req,res,next){
if(req.method === 'GET')
//whatever you are going to do
else
return next() //it passes the request to app.put
//Where would GET response 404 go, here? or in the next one.
// Will the GET answer be handled by a PUT? Something is wrong here.
})
app.put('/user/:id', function (req,res,next){
if(req.method === 'PUT')
//whatever you are going to do
else
return next()
})
El problema radica en que, al final, terminas pasando la solicitud a todos los controladores con la esperanza de que haya una que haga lo que quieras, mediante la validación de la solicitud. Al final, todos los controladores terminan recibiendo algo que no es para ellos :(.
Entonces, ¿cómo evitar el problema de next () ?
La respuesta es realmente simple.
1- solo debe haber una uri para identificar un recurso
http: // IpServidor / colection /: resource / colection /: resource si su URI es más largo que eso, debería considerar crear una nueva uri
Ejemplo http: // IpServidor / users / pepe / contactos / contacto1
2-Todas las operaciones en este recurso deben realizarse respetando la idempotencia de los verbos http (get, post, put, delete, ...) para que la llamada a un URI realmente solo tenga una forma de llamar
POST http://IpServidor/users/ //create a pepe user
GET http://IpServidor/users/pepe //user pepe returns
PUT http://IpServidor/users/pepe //update the user pepe
DELETE http://IpServidor/users/pepe //remove the user pepe
Más información [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resourcesfont>[1]
¡Veamos el código! ¡La implementación concreta que nos hace evitar el uso de next ()!
En el archivo index.js
//index.js the entry point to the application also caller app.js
const express = require('express');
const app = express();
const usersRoute = require('./src/route/usersRoute.js');
app.use('/users', usersRoute );
En el archivo usersRoute.js
//usersRoute.js
const express = require('express');
const router = express.Router();
const getUsersController = require('../Controllers/getUsersController.js');
const deleteUsersController = require('../Controllers/deleteUsersController.js');
router.use('/:name', function (req, res) //The path is in /users/:name
{
switch (req.method)
{
case 'DELETE':
deleteUsersController(req, res);
break;
case 'PUT':
// call to putUsersController(req, res);
break;
case 'GET':
getUsersController(req, res);
break;
default:
res.status(400).send('Bad request');
} });
router.post('/',function (req,res) //The path is in /users/
{
postUsersController(req, res);
});
module.exports = router;
Ahora el archivo usersRoute.js hace lo que se espera que haga un archivo llamado usersRoute, que es administrar las rutas del URI / users /
// archivo getUsersController.js
//getUsersController.js
const findUser= require('../Aplication/findUser.js');
const usersRepository = require('../Infraestructure/usersRepository.js');
const getUsersController = async function (req, res)
{
try{
const userName = req.params.name;
//...
res.status(200).send(user.propertys())
}catch(findUserError){
res.status(findUserError.code).send(findUserError.message)
}
}
module.exports = getUsersController;
De esta forma, evita el uso de next, desacopla el código, gana rendimiento, desarrolla SOLID, deja la puerta abierta para una posible migración a microservicios y, sobre todo, es fácil de leer por un programador.
res.redirect('/')
vs.return res.redirect('/')
en este tipo de situación? ¿Quizás es mejor escribir siempre el retorno frente a las declaraciones de resolución para evitar errores de configuración de encabezados después de enviarlos?