2013-05-29 14 views
66

परिदृश्य: निम्न पर विचार करें नोड वेब ऐप से कोड का हिस्सा है।अगला() का उपयोग कब करें और अगला() वापस नोड.जेएस

app.get('/users/:id?', function(req, res, next){ 
    var id = req.params.id; 
    if (id) { 
     // do something 
    } else { 
     next(); //or return next(); 
    } 
}); 

अंक: मैं जो एक बस next() या return next() साथ जाने के लिए जाँच कर रहा हूँ। ऊपर नमूना कोड & दोनों के लिए निष्पादन में कोई अंतर नहीं दिखाता है।

प्रश्न: इस पर कुछ एक पुट प्रकाश, जब next() उपयोग करने के लिए कर सकते हैं और जब return next() और कुछ महत्वपूर्ण अंतर उपयोग कैसे करें?

उत्तर

63

कुछ लोग हमेशा return next() लिखते हैं यह सुनिश्चित करना है कि कॉलबैक ट्रिगर करने के बाद निष्पादन बंद हो जाता है।

यदि आप ऐसा नहीं करते हैं, तो आप दूसरी बार कॉलबैक को ट्रिगर करने का जोखिम लेते हैं, जो आमतौर पर विनाशकारी परिणाम होता है। के रूप में यह है आपका कोड ठीक है, लेकिन मैं इसे फिर से लिखने के रूप में:

app.get('/users/:id?', function(req, res, next){ 
    var id = req.params.id; 

    if(!id) 
     return next(); 

    // do something 
}); 

यह मुझे एक खरोज स्तर बचाता है, और जब मैं बाद में फिर से कोड को पढ़ने के लिए, मुझे यकीन है कि कोई रास्ता नहीं next दो बार कहा जाता है कर रहा हूँ ।

35

next()connect middleware का हिस्सा है। यदि आप अपने कार्यों से कुछ भी वापस करते हैं तो राउटर प्रवाह के लिए कॉलबैक परवाह नहीं है, इसलिए return next() और next(); return; मूल रूप से वही है।

मामले में आप कार्यों के प्रवाह को आप निम्नलिखित

app.get('/user/:id?', 
    function(req, res, next) { 
     console.log('function one'); 
     if (!req.params.id) 
      next('No ID'); // This will return error 
     else 
      next(); // This will continue to function 2 
    }, 
    function(req, res) { 
     console.log('function two'); 
    } 
); 

सुंदर ज्यादा next() आपके अनुरोधों के मिडलवेयर देने के लिए प्रयोग किया जाता है की तरह next(err) उपयोग कर सकते हैं बंद करना चाहते हैं।

+0

क्या हम पैरामीटर भेज सकते हैं जैसे: 'अगला (' कोई आईडी ') '? –

+5

'अगला (' कोई आईडी ') वास्तव में एक त्रुटि भेज रहा है, जो प्रवाह को तोड़ देगा। – drinchev

+0

अगला (शून्य, "कुछ") का उपयोग करें; Async.waterfall जैसे उपकरणों के लिए यह अगले फ़ंक्शन के मान को पास कर देगा। डेटा संचालित संचालित इंटरैक्शन की जटिल श्रृंखला के लिए, मैं आमतौर पर कार्यों के बीच एक संदर्भ वस्तु पास करता हूं। इस तरह से मैं जेनेरिक फ़ंक्शंस बना सकता हूं जिसे कई अंत बिंदुओं में साझा किया जा सकता है और संदर्भ –

28

@Laurent पेरिन के जवाब के रूप में:

आप यह मत करो, तो आप दूसरी बार बाद में कॉलबैक ट्रिगर जोखिम, जो आमतौर पर विनाशकारी परिणाम

मैं यहां एक उदाहरण देना है अगर आप इस तरह मिडलवेयर लिखें:

app.use((req, res, next) => { 
    console.log('This is a middleware') 
    next() 
    console.log('This is first-half middleware') 
}) 

app.use((req, res, next) => { 
    console.log('This is second middleware') 
    next() 
}) 

app.use((req, res, next) => { 
    console.log('This is third middleware') 
    next() 
}) 

आप पता चलेगा कंसोल में उत्पादन होता है कि:

This is a middleware 
This is second middleware 
This is third middleware 
This is first-half middleware 

यही है, यह सभी मिडलवेयर फ़ंक्शन समाप्त होने के बाद अगला() नीचे कोड चलाता है।

हालांकि, यदि आप return next() का उपयोग करते हैं, तो यह तुरंत कॉलबैक को बाहर कर देगा और कॉलबैक में return next() से नीचे कोड पहुंच योग्य नहीं होगा।

+1

एक उत्तरदाता के रूप में 'उत्तर' देने के लिए इस उत्तर ने अन्य उत्तरों की तुलना में चीजों को स्पष्ट किया। थम्स अप! – mandarin

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