2011-10-03 11 views
23

मेरे पास Node.js (एक्सप्रेस और मोंगोस का उपयोग करके) में निम्न नियंत्रक/मार्ग परिभाषा है। जब उपयोगकर्ता उस पृष्ठ का अनुरोध करता है जो मौजूद नहीं है तो त्रुटि को संभालने का सबसे कम संभव तरीका क्या होगा?नोड.जेएस/एक्सप्रेस - पेज नहीं मिला जब

app.get('/page/:pagetitle', function(req, res) { 
     Page.findOne({ title: req.params.pagetitle}, function(error, page) { 
      res.render('pages/page_show.ejs', 
      { locals: { 
       title: 'ClrTouch | ' + page.title, 
       page:page 
      } 
      }); 
     }); 
    }); 

यह वर्तमान में मेरे ऐप को तोड़ देता है। मेरा मानना ​​है क्योंकि मैं त्रुटि के साथ कुछ भी नहीं कर रहा हूं, मैं इसे सफलता की तरह देख रहा हूं?

TypeError: Cannot read property 'title' of null 

बहुत धन्यवाद।

उत्तर

46

एक्सप्रेस error-pages उदाहरण देखें। सिद्धांत है कि आप अपने ऐप रूट्स को पहले पंजीकृत करें, फिर आप उन सभी अन्य अनुरोधों के लिए सभी 404 हैंडलर को पकड़ें जो रूट पर मैप नहीं करते हैं। अंत में, एक 500 हैंडलर पंजीकृत है, निम्नानुसार है:

// "app.router" positions our routes 
// specifically above the middleware 
// assigned below 

app.use(app.router); 

// Since this is the last non-error-handling 
// middleware use()d, we assume 404, as nothing else 
// responded. 

app.use(function(req, res, next){ 
    // the status option, or res.statusCode = 404 
    // are equivalent, however with the option we 
    // get the "status" local available as well 
    res.render('404', { status: 404, url: req.url }); 
}); 

// error-handling middleware, take the same form 
// as regular middleware, however they require an 
// arity of 4, aka the signature (err, req, res, next). 
// when connect has an error, it will invoke ONLY error-handling 
// middleware. 

// If we were to next() here any remaining non-error-handling 
// middleware would then be executed, or if we next(err) to 
// continue passing the error, only error-handling middleware 
// would remain being executed, however here 
// we simply respond with an error page. 


app.use(function(err, req, res, next){ 
    // we may use properties of the error object 
    // here and next(err) appropriately, or if 
    // we possibly recovered from the error, simply next(). 
    res.render('500', { 
     status: err.status || 500 
    , error: err 
    }); 
}); 
+0

हाँ, मुझे लगता है कि मैं एक्सप्रेस उदाहरणों से गुजर चुका हूं। लेकिन यह वैसे भी काफी मददगार था। मैंने अपना खुद का 500.ejs आदि बनाया ... विचारों में और अब वे आवश्यकतानुसार प्रस्तुत करते हैं लेकिन निर्दिष्ट होने पर मैं अपने स्वयं के त्रुटि संदेश भी जोड़ सकता हूं। धन्यवाद। – tuddy

+1

जब मैं 404 हैंडलिंग के साथ app.use() में जोड़ता हूं, तो यह किसी भी कारण से सार्वजनिक फ़ोल्डर में सामान के लिए मेरे सभी मार्गों को गड़बड़ कर देता है। जैसे /stylesheets/style.css अचानक खो जाता है, क्योंकि इसे सामान्य रूप से मेरे ईजे टेम्पलेट से एक्सेस किया जाता है। इसके लिए कोई सुझाव? – netpoetica

+0

मैं एक्सप्रेस app.use() मिडलवेयर के साथ इस मुद्दे को ठीक करने में सक्षम था, बस यहाँ दिए गए उदाहरण से पहले app.use (static ....) को स्थानांतरित करके मेरे स्थिर पथ को तोड़कर – netpoetica

3

नोड.जेएस के साथ बड़ी समस्याओं में से एक यह है कि कोई साफ त्रुटि पकड़ नहीं है। परंपरागत तरीके से हर कॉलबैक समारोह के लिए आमतौर पर है, पहले तर्क, यदि कोई त्रुटि होती है रिक्त नहीं है, तो उदाहरण के लिए:

function(error, page){ 
    if(error != null){ 
     showErrorPage(error, req, res); 
     return; 
    } 
    ...Page exists... 
} 

चीजें भी कई कॉलबैक के साथ कुछ समय के बाद बदसूरत प्राप्त कर सकते हैं, और मैं का उपयोग करना चाहिये async जैसे कुछ, ताकि अगर कोई त्रुटि हो, तो यह सीधे एक त्रुटि कॉलबैक पर जाती है।

संपादित करें: आप express error handling का भी उपयोग कर सकते हैं।

+0

+1 आपके उत्तर के लिए, क्योंकि यह सहायक था। 'शून्य' के बजाय 'अपरिभाषित' नहीं होना चाहिए। –

+0

@ सुशांत गुप्ता संख्या, ** निक्कन ** सही है। यह या तो शून्य है या त्रुटि वस्तु है। –

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