इसका उपयोग नहीं करना सबसे अच्छा है! मैं समझाता हूं, और यही मैं इसकी व्याख्या भी करता हूं।
अगला () फ़ंक्शन जिसमें कोई भी नाम हो सकता है और कन्वेंशन द्वारा अगले पर सेट किया गया है। यह अप्रत्यक्ष रूप से संचालन (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) एक्सप्रेस req को पहले app.get में डालता है, यदि आपके द्वारा बनाया गया कोई सत्यापन क्योंकि वह अनुरोध उस नियंत्रक के लिए नहीं है, तो यह req को app.put को पास कर देता है, जो कि अगली फ़ाइल te file में है। पर। जैसा कि नीचे दिए गए उदाहरण में देखा गया है।
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()
})
समस्या यह है, कि अंत में आप सभी नियंत्रकों के लिए अनुरोध पास करना समाप्त करते हैं, यह उम्मीद करते हैं कि एक वही है जो आप चाहते हैं, जो कि रीक के सत्यापन के माध्यम से होता है। अंत में सभी नियंत्रक कुछ ऐसा प्राप्त करते हैं जो उनके लिए नहीं है :(।
तो, अगली () की समस्या से कैसे बचें ?
उत्तर वास्तव में सरल है।
1- संसाधन की पहचान करने के लिए केवल एक यूआरआई होना चाहिए
http: // IpServidor / colection /: resource / colection /: संसाधन यदि आपका URI इससे अधिक लंबा है, तो आपको एक नया uri बनाने पर विचार करना चाहिए
उदाहरण http: // IpServidor / उपयोगकर्ताओं / पेपे / संपर्क / 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/altecture/best-practices/api-design#organize-the-api-around-resourcesearch1]
कोड देखते हैं! ठोस कार्यान्वयन जो हमें अगले () के उपयोग से बचाता है!
फ़ाइल इंडेक्स में। 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 );
फ़ाइल में userRoute.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;
अब userRoute.js फ़ाइल वह करता है जो कि userRoute नामक एक फाइल को करने की अपेक्षा की जाती है, जो कि URI / उपयोगकर्ताओं / के मार्गों का प्रबंधन करना है।
// फ़ाइल getUserController.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;
इस तरह आप अगले के उपयोग से बचते हैं, आप कोड को कम कर देते हैं, आप प्रदर्शन में लाभ प्राप्त करते हैं, आप SOLID का विकास करते हैं, आप माइक्रोसर्विस के लिए संभावित प्रवास के लिए दरवाजा खुला छोड़ देते हैं और सबसे ऊपर, प्रोग्रामर द्वारा पढ़ना आसान होता है।
res.redirect('/')
बनाम की बात सच होगीreturn res.redirect('/')
? हो सकता है कि भेजे जाने के बाद हेडर सेट करने की त्रुटियों से बचने के लिए रिज़ॉर्ट स्टेटमेंट के सामने हमेशा रिटर्न लिखना बेहतर हो?