Tốt nhất là không nên sử dụng nó! Tôi giải thích, và đó là những gì tôi làm cũng giải thích nó.
Hàm next () có thể có bất kỳ tên nào và theo quy ước đã được đặt thành next. Nó liên quan gián tiếp đến các hoạt động (PUT, GET, DELETE, ...) thường được thực hiện trên cùng một tài nguyên 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 ()...)
Bây giờ nếu bạn xem app.get, app.put và app.delete sử dụng cùng một uri (/ user /: id), điều duy nhất phân biệt chúng là việc thực hiện chúng. Khi yêu cầu được thực hiện (req) express đặt req lên đầu tiên trong app.get, nếu bất kỳ xác thực nào bạn tạo vì yêu cầu đó không dành cho bộ điều khiển đó không thành công, nó sẽ chuyển req tới app.put là tuyến tiếp theo trong tệp te và vì vậy trên. Như đã thấy trong ví dụ dưới đây.
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()
})
Vấn đề nằm ở chỗ, cuối cùng bạn sẽ chuyển req cho tất cả các bộ điều khiển với hy vọng rằng có một cái thực hiện những gì bạn muốn, thông qua việc xác nhận req. Cuối cùng, tất cả các bộ điều khiển cuối cùng nhận được thứ gì đó không dành cho họ :(.
Vậy, làm thế nào để tránh vấn đề của next () ?
Câu trả lời thực sự đơn giản.
1- chỉ nên có một uri để xác định tài nguyên
http: // IpServidor / colection /: resource / colection /: resource nếu URI của bạn dài hơn thế, bạn nên xem xét việc tạo một uri mới
Ví dụ http: // IpServidor / users / pepe / contact / contacto1
2-Tất cả các hoạt động trên tài nguyên này phải được thực hiện tôn trọng tính không thay đổi của các động từ http (get, post, put, xóa, ...) để cuộc gọi đến URI thực sự chỉ có một cách gọi
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
Thêm thông tin [ https://docs.microsoft.com/es-es/azure/arch architecture / best-primary / api-design # Organize-the-api-around-resource [[1 ]
Hãy xem mã! Việc triển khai cụ thể khiến chúng ta tránh sử dụng next ()!
Trong tệp 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 );
Trong tệp 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;
Bây giờ, tệp usersRoute.js thực hiện những gì một tệp có tên usersRoute dự kiến sẽ làm, đó là quản lý các tuyến của URI / users /
// tập tin getUsersControll.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;
Theo cách này, bạn tránh sử dụng tiếp theo, bạn tách mã, bạn đạt được hiệu suất, bạn phát triển RẮN, bạn để mở cửa cho việc di chuyển có thể sang microservice và trên hết, rất dễ đọc bởi một lập trình viên.
res.redirect('/')
với so vớireturn res.redirect('/')
loại tình huống này? Có lẽ tốt hơn là luôn luôn viết trở lại trước các câu lệnh res để tránh các lỗi thiết lập tiêu đề sau khi chúng được gửi?