2012-11-02 18 views
19

नहीं कहा जा रहा है, मैं अपने एक्सप्रेस ऐप के लिए त्रुटि प्रबंधन सेट करने और निम्न समस्या में चलने की कोशिश कर रहा हूं।एक्सप्रेस 3 त्रुटि मिडलवेयर को

मैं एक त्रुटि मिडलवेयर परिभाषित और पिछले मध्यस्थ के रूप में जोड़ें:

app.get('/datenschutz', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }); 

हालांकि मेरी मिडलवेयर कभी नहीं है:

// error handler 
app.use(function(err, req, res, next) { 

    console.log('JUST TESTING. ERROR HANLDER HAS BEEN CALLED...'); 
    next(err); 
}); 

अब मैं जब भी कोई त्रुटि होती है उम्मीद करेंगे इस मिडलवेयर के नाम से जाना बुलाया! ब्राउज़र हालांकि स्टैक ट्रेस प्रदर्शित करता है। ऐसा लगता है कि एक और मिडलवेयर है जो इस त्रुटि को पकड़ रहा है और इसके बारे में कुछ भी करने से पहले इसे संसाधित कर रहा है।

// setup ssl for local testing 
var 
    app = express(); 

app. 
    use(express.static(__dirname + '/public')). 
    use(express.bodyParser()). 
    use(express.cookieParser()); 

मेरी त्रुटि क्यों निपटने है मिडलवेयर नहीं बुलाया जा रहा है:

समस्या यह है कि मैं कोई सुराग नहीं है जहां इस मिडलवेयर में परिभाषित किया जा सकता है, जैसा कि मैंने एक बहुत ही सरल सेटअप है? यह 'डिफ़ॉल्ट' त्रुटि होल्डिंग कहां हो रही है?

धन्यवाद!

* संपादित करें * मुझे लगता है कि मिडलवेयर वास्तव में काम कर रहा है। हालांकि यह मामला है अगर मैं इसे किसी अन्य मिडलवेयर फ़ंक्शन से कॉल करता हूं। हालांकि अगर यह एक एक्सप्रेस मार्ग (GET, POST, आदि ..) के रूप में परिभाषित फ़ंक्शन के अंदर त्रुटि उत्पन्न होती है तो इसे लागू नहीं किया जा रहा है। यह बहुत अजीब है। अगर मैं मार्ग कॉलबैक यह तो काम करता है करने के लिए अपने त्रुटि मिडलवेयर जोड़ें:

app.get('/testError', function(req, res, next){ 
     return next(new Error('Just testing')); // handle everything here 
    }, function(err,req,res,next) { 
     console.log('This error handler is called!!'); 
     return next(); 
    }); 

* संपादित करें 2 - पाया स्वीकार्य कारगर युक्तियाँ ** मैं इसे इस तरह से किया जा सकता है हैरान हूं। जैसा कि मैंने एक्सप्रेस में त्रुटि प्रबंधन के बारे में कई प्रविष्टियां/प्रश्न पढ़े थे और कभी भी इस संभावना का उल्लेख नहीं किया था। हालांकि ऐसा लगता है कि अगर रूट कॉलबैक के अंदर एक त्रुटि ocurrs नियमित त्रुटि मिडलवेयर हैंडलर इसे नहीं उठाएंगे। आपको रूट स्तर पर एक त्रुटि हैंडलर को परिभाषित करने की आवश्यकता होगी।

app.all('*', function(err,req,res,next) { 
     console.log('This is a global error handler at route level....'); 
     return next(err); 
    }); 
+3

क्या आपके पास 'app.use (app.router)' पहले त्रुटि हैंडलर 'app' पर सेट किया जाता है? – staackuser2

+0

@emostar - नहीं। सभी मिडलवेयर ऊपर सूचीबद्ध है। – santiagoIT

+9

ठीक है, फिर त्रुटि हैंडलर से पहले 'app.use (app.router)' जोड़ें;) – staackuser2

उत्तर

1

EDIT 2 (sabtioagoIT) काम करता है। लेकिन सिर्फ उन लोगों के लिए जो इसे चूक गए, इमोस्टर का समाधान भी काम करता है। मुझे अंत में 'उपयोग' कॉल को अंत में संभालने में त्रुटि हुई, लेकिन एमोस्टर सुझाव देने के लिए एक आसान विकल्प प्रतीत होता है, app.router (त्रुटि हैंडलिंग 'उपयोग' कॉल से पहले) का उपयोग करें।

3

मुझे यह समस्या भी थी, लेकिन मुझे पता नहीं चला कि यह क्यों काम नहीं कर रहा था, भले ही मैं app.user(app.router) के बाद अपना त्रुटि हैंडलर सेट करता हूं। जैसा कि यह पता चला है, मेरे पास पहले से ही एक त्रुटि हैंडलर था जिसे मुझे पता नहीं था।

विशेष रूप से, अगर आप एक्सप्रेस CLI का उपयोग किसी ऐप की तरह मैंने किया उत्पन्न करने के लिए, यह स्वतः ही इस में में जोड़ देगा:

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 
दुर्भाग्य से मेरे लिए

, मैं अपने ऐप पर थोड़ा अधिक मिडलवेयर जोड़ा जो नतीजतन इस कथन को अस्पष्ट कर दिया और इस प्रकार मेरे कस्टम त्रुटि हैंडलर को बुलाए जाने से रोका।

बस इसे हटाएं और फिर इसे ठीक से काम करना चाहिए।

एक तरफ ध्यान दें पर, मैं उल्लेख करना चाहिए कि मूल समाधान अभी भी काम किया है - भले app.use(express.errorHandler()) साथ।

app.all('*', function(err,req,res,next) { 
    console.log('This is a global error handler at route level....'); 
    return next(err); 
}); 
1

एक्सप्रेस 4 उपयोगकर्ताओं from the Express 4 docs के लिए अद्यतन उत्तर। नीचे दिए गए दस्तावेज़ों से उदाहरण देखें। ध्यान दें कि app.router हटा दिया गया है और अब उपयोग नहीं।

: मैं भी आदेश स्पष्ट करना एक डमी मार्ग कहा, "आपको त्रुटि हैंडलिंग मिडलवेयर पिछले परिभाषित करते हैं, अन्य app.use() और मार्गों के बाद कॉल; उदाहरण के लिए:

var bodyParser = require('body-parser'); 

app.use(bodyParser()); 
app.get('/', function(req, res) { 
    res.send('hello world'); 
}) 
app.use(function(err, req, res, next) { 
    // logic 
}); 

"

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