2012-05-22 9 views
185

मान लीजिए आप इस तरह कोड का एक सरल ब्लॉक:एक्सप्रेस में "अगली" पैरामीटर क्या है?

app.get('/', function(req, res){ 
    res.send('Hello World'); 
}); 

इस समारोह दो पैरामीटर, req और res, जो अनुरोध का प्रतिनिधित्व करते है और प्रतिक्रिया क्रमशः वस्तुओं।

दूसरी तरफ, next नामक तीसरे पैरामीटर वाले अन्य फ़ंक्शन हैं। उदाहरण के लिए, की सुविधा देता है निम्नलिखित कोड पर एक नजर है:

app.get('/users/:id?', function(req, res, next){ // Why do we need next? 
    var id = req.params.id; 
    if (id) { 
     // do something 
    } else { 
     next(); // What is this doing? 
    } 
}); 

मैं नहीं समझ सकता क्या next() की बात है या क्यों अपनी इस्तेमाल किया जा रहा। उस उदाहरण में, यदि आईडी मौजूद नहीं है, तो वास्तव में next क्या है?

+6

अगला अगले अनुरोध को संभालने के लिए अगले रूट हैंडलर को बस अनुमति देता है। इस मामले में, यदि उपयोगकर्ता आईडी मौजूद है, तो अनुरोध को पूरा करने के लिए यह संभवतः 'res.send' का उपयोग करेगा। यदि यह अस्तित्व में नहीं है, तो संभवतः एक और हैंडलर है जो एक त्रुटि जारी करेगा और अनुरोध को पूरा करेगा। –

+1

तो आप कह रहे हैं कि मेरे पास 'app.post ('/ login', function (req, res))' 'app.get ('/ users', function (req, res) के बाद है) 'यह लॉगिन करेगा अगले() को कॉल करके app.js फ़ाइल में अगला मार्ग होने के नाते? – Menztrual

+2

नहीं, आपको Express.js दस्तावेज़ के इस भाग का संदर्भ लेना चाहिए: http://expressjs.com/guide.html#passing-route नियंत्रण –

उत्तर

198

यह मिलान मार्ग पर नियंत्रण पास करता है। उदाहरण के लिए, उदाहरण के लिए, यदि आप id दिए गए थे, तो आप डेटाबेस में उपयोगकर्ता को देख सकते हैं, और इसे req.user पर असाइन करें।

के नीचे, आपको एक मार्ग हो सकता है:

app.get('/users', function(req, res) { 
    // check for and maybe do something with req.user 
}); 

के बाद से/उपयोगकर्ताओं/123 पहली बार अपने उदाहरण में मार्ग, कि पहले की जाँच करें और उपयोगकर्ता 123 मिलेगा से मेल खाएगा; तो /users इसके परिणामस्वरूप कुछ कर सकता है।

Route middleware (नोट: लिंक 2.x दस्तावेज है, लेकिन यह 3.x पर काम करने के रूप में परीक्षण किया जाता है) एक और अधिक लचीला और शक्तिशाली उपकरण है, हालांकि, मेरी राय में, क्योंकि यह किसी विशेष पर भरोसा नहीं करता है यूआरआई योजना या मार्ग आदेश। मैं उदाहरण कुछ ऐसा दिखाया मॉडल करने के लिए, एक async findOne() के साथ एक Users मॉडल मानते हुए इच्छुक होगी:

function loadUser(req, res, next) { 
    if (req.params.userId) { 
    Users.findOne({ id: req.params.userId }, function(err, user) { 
     if (err) { 
     next(new Error("Couldn't find user: " + err)); 
     return; 
     } 

     req.user = user; 
     next(); 
    }); 
    } else { 
    next(); 
    } 
} 

// ... 

app.get('/user/:userId', loadUser, function(req, res) { 
    // do something with req.user 
}); 

app.get('/users/:userId?', loadUser, function(req, res) { 
    // if req.user was set, it's because userId was specified (and we found the user). 
}); 

// Pretend there's a "loadItem()" which operates similarly, but with itemId. 
app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) { 
    req.user.items.append(req.item.name); 
}); 

प्रवाह को नियंत्रित करने में सक्षम होने के नाते की तरह यह बहुत आसान है। हो सकता है कि आप कुछ पेज केवल व्यवस्थापक ध्वज वाले उपयोगकर्ताओं के लिए उपलब्ध हो:

/** 
* Only allows the page to be accessed if the user is an admin. 
* Requires use of `loadUser` middleware. 
*/ 
function requireAdmin(req, res, next) { 
    if (!req.user || !req.user.admin) { 
    next(new Error("Permission denied.")); 
    return; 
    } 

    next(); 
} 

app.get('/top/secret', loadUser, requireAdmin, function(req, res) { 
    res.send('blahblahblah'); 
}); 

आशा है कि इससे आपको कुछ प्रेरणा मिलेगी!

+0

तो यह एक मार्ग में कोड का एक टन कम कर देता है? – Menztrual

+0

आप यह कह सकते हैं! मैं [रूट मिडलवेयर] (http://expressjs.com/guide.html#route-middleware) के साथ इस तरह की चीज करने के इच्छुक हूं, हालांकि, यह किसी विशेष क्रम के तर्क को जोड़ता नहीं है मार्ग, या विशेष यूआरआई संरचनाएं। – Ashe

+0

"रूट मिडलवेयर" लिंक टूटा हुआ लगता है (# प्रत्यय का कोई प्रभाव नहीं है), क्या आप ठीक कर सकते हैं? – djechlin

46

मैं भी अगले (समझने समस्या) था, लेकिन this मदद की

var app = require("express")(); 

app.get("/", function(httpRequest, httpResponse, next){ 
    httpResponse.write("Hello"); 
    next(); //remove this and see what happens 
}); 

app.get("/", function(httpRequest, httpResponse, next){ 
    httpResponse.write(" World !!!"); 
    httpResponse.end(); 
}); 

app.listen(8080); 
+2

बहुत संक्षिप्त! धन्यवाद! लेकिन आप कैसे सुनिश्चित करते हैं कि पहला '.get' कहा जाता है और दूसरा नहीं? – JohnnyQ

+8

@ जॉनीकीक यह नीचे से नीचे निष्पादन – Tapash

4

अगला अगले मिडलवेयर कार्य करने के लिए नियंत्रण बढ़ाने के लिए प्रयोग किया जाता है। अगर अनुरोध लटका या खुला नहीं छोड़ा जाएगा।

+1

होगा मुझे यकीन नहीं है कि यह उत्तर लगभग सात वर्षीय प्रश्न में क्या जोड़ता है ... – mherzig

+0

हालांकि, यह टिप्पणी मुझे इस पर ले जाती है: https://expressjs.com /en/guide/writing-middleware.html – hmak

0

इस फ़ंक्शन को कॉल करने से ऐप में अगले मिडलवेयर फ़ंक्शन को आमंत्रित किया जाता है। अगला() फ़ंक्शन नोड.जेएस या एक्सप्रेस एपीआई का हिस्सा नहीं है, लेकिन यह तीसरा तर्क है जो मिडलवेयर फ़ंक्शन को पास किया जाता है। अगले() फ़ंक्शन को कुछ भी नाम दिया जा सकता है, लेकिन सम्मेलन द्वारा इसे हमेशा "अगला" नाम दिया जाता है।

संबंधित मुद्दे