2016-04-25 4 views
5

app.js में, मैं तो अगर मैं अनुरोध करता हूँ कुछ http://localhost/notfound तरह यूआरएल मौजूद नहीं, ऊपर कोड को निष्पादित करेंगेexpress.js में 404 त्रुटि कैसे फेंकें?

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

है।

http://localhost/posts/:postId जैसे यूआरएल मौजूद है, तो मैं कुछ मौजूदा पोस्ट आईडी या हटाए गए पोस्ट आईडी तक पहुंचने पर 404 त्रुटि फेंकना चाहता हूं।

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     // How to throw a 404 error, so code can jump to above 404 catch? 
    } 
+0

क्या यह 'Posts.findOne' पृष्ठ अनुरोध के भीतर या पृष्ठ अनुरोध के भीतर एक वादा कहा जाता है? –

उत्तर

3

In Express, a 404 isn't classed as an 'error', so to speak - इस के पीछे तर्क है, जो 404 आम तौर पर एक संकेत है कि कुछ गलत हो गया है नहीं है, यह सिर्फ इतना है कि सर्वर कुछ भी नहीं मिला है। आपका सबसे अच्छा शर्त स्पष्ट रूप से अपने मार्ग हैंडलर में 404 भेजने के लिए है:

function notFound(res) { 
    res.status(404).send("Not found."); 
} 

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
     .then(function(post) { 
     if(!post) { 
      notFound(res); 
     } 
: वैकल्पिक रूप से

Posts.findOne({_id: req.params.id, deleted: false}).exec() 
    .then(function(post) { 
    if(!post) { 
     res.status(404).send("Not found."); 
    } 

या, अगर यह बहुत ज्यादा बार-बार कोड की तरह लगता है, तो आप हमेशा एक समारोह में बाहर है कि कोड खींच सकता है

मैं इस स्थिति में केवल एक मिडलवेयर का उपयोग करने की अनुशंसा नहीं करता क्योंकि मुझे लगता है कि यह कोड को कम स्पष्ट करता है - 404 डेटाबेस कोड का प्रत्यक्ष परिणाम कुछ भी नहीं ढूंढ रहा है, इसलिए यह रूट हैंडलर में प्रतिक्रिया प्राप्त करने के लिए समझ में आता है ।

0

आप इस और अपने रूटर के अंत का उपयोग कर सकते की तरह कुछ के लिए देख रहे हैं।

app.use('/', my_router); 
.... 
app.use('/', my_router); 

app.use(function(req, res, next) { 
     res.status(404).render('error/404.html'); 
    }); 
2

मैं एक ही app.js संरचना है, और मुझे मार्ग हैंडलर में इस तरह से इस समस्या का समाधान:

router.get('/something/:postId', function(req, res, next){ 
    // ... 
    if (!post){ 
     next(); 
     return; 
    } 
    res.send('Post exists!'); // display post somehow 
}); 

next() समारोह अगले मिडलवेयर जो error404 हैंडलर अगर है फोन करेगा यह app.js. में आपके मार्गों के ठीक बाद है।

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