Il vaut mieux ne pas l'utiliser du tout! J'explique, et c'est ce que je fais aussi l'expliquer.
La fonction next () qui peut avoir n'importe quel nom et par convention a été définie sur next. Il est indirectement lié aux opérations (PUT, GET, DELETE, ...) qui sont généralement effectuées sur la même ressource URI par exemple/ 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 ()...)
Maintenant, si vous regardez app.get, app.put et app.delete utilisent le même uri (/ user /: id), la seule chose qui les différencie est leur implémentation. Lorsque la demande est faite (req) express place la req en premier dans app.get, si une validation que vous avez créée parce que cette demande n'est pas pour ce contrôleur échoue, elle transmet la demande à app.put qui est la prochaine route dans le fichier et ainsi sur. Comme vu dans l'exemple ci-dessous.
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()
})
Le problème, c'est qu'à la fin vous finissez par passer la req à tous les contrôleurs en espérant qu'il y en a un qui fait ce que vous voulez, via la validation de la req. À la fin, tous les contrôleurs finissent par recevoir quelque chose qui n'est pas pour eux :(.
Alors, comment éviter le problème de next () ?
La réponse est vraiment simple.
1- il ne devrait y avoir qu'un seul uri pour identifier une ressource
http: // IpServidor / colection /: resource / colection /: resource si votre URI est plus long que cela, vous devriez envisager de créer un nouvel uri
Exemple http: // IpServidor / users / pepe / contacts / contacto1
2-Toutes les opérations sur cette ressource doivent être effectuées en respectant l'idempotence des verbes http (get, post, put, delete, ...) donc l'appel à un URI n'a vraiment qu'une seule façon d'appeler
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
Plus d'infos [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources[1]
Voyons le code! L'implémentation concrète qui nous fait éviter l'utilisation de next ()!
Dans le fichier 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 );
Dans le fichier 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;
Maintenant, le fichier usersRoute.js fait ce qu'un fichier appelé usersRoute est censé faire, c'est-à-dire gérer les routes de l'URI / users /
// fichier 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 cette façon, vous évitez l'utilisation du suivant, vous découplez le code, vous gagnez en performance, vous développez SOLID, vous laissez la porte ouverte à une éventuelle migration vers des microservices et surtout, il est facile à lire par un programmeur.
res.redirect('/')
vsreturn res.redirect('/')
dans ce type de situation? Il est peut-être préférable de toujours écrire return devant les instructions res pour éviter les erreurs de définition des en-têtes après leur envoi?