Лучше вообще не использовать! Я объясняю, и это то, что я тоже объясняю.
Функция next (), которая может иметь любое имя и по соглашению установлена на next. Это косвенно связано с операциями (PUT, GET, DELETE, ...), которые обычно выполняются на одном и том же ресурсе URI, например/ 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 ()...)
Теперь, если вы посмотрите на app.get, app.put и app.delete используют один и тот же uri (/ user /: id), единственное, что их отличает, - это их реализация. Когда запрос сделан (req), express сначала помещает req в app.get, если какая-либо проверка, которую вы создали, потому что этот запрос не для этого контроллера, терпит неудачу, он передает req в app.put, который является следующим маршрутом в файле te, и поэтому на. Как видно из приведенного ниже примера.
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()
})
Проблема заключается в том, что в конце концов вы передаете req всем контроллерам, надеясь, что есть тот, который делает то, что вы хотите, посредством проверки req. В конце концов, все контроллеры получают то, что им не подходит :(.
Итак, как избежать проблемы с next () ?
Ответ действительно прост.
1- должен быть только один uri для идентификации ресурса
http: // IpServidor / colection /: resource / colection /: resource, если ваш URI длиннее этого, вам следует подумать о создании нового uri
Пример http: // IpServidor / users / pepe / contacts / contacto1
2-Все операции с этим ресурсом должны выполняться с соблюдением идемпотентности глаголов http (get, post, put, delete, ...), поэтому вызов URI действительно имеет только один способ вызова
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
Дополнительная информация [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources visible [1 ]
Посмотрим код! Конкретная реализация, которая заставляет нас избегать использования next ()!
В файле 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 );
В файле 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;
Теперь файл usersRoute.js выполняет то, что должен делать файл с именем usersRoute, а именно управлять маршрутами URI / users /
// файл 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;
Таким образом, вы избегаете использования next, вы разделяете код, вы повышаете производительность, вы разрабатываете SOLID, вы оставляете дверь открытой для возможного перехода на микросервисы и, прежде всего, его легко читать программисту.
res.redirect('/')
vs.return res.redirect('/')
в подобной ситуации? Может, лучше всегда писать return перед операторами res, чтобы избежать ошибок установки заголовков после их отправки?