2013-03-28 11 views
18

मैं एक्सप्रेस के साथ चलने में त्रुटि प्रबंधन करने की कोशिश कर रहा हूं लेकिन "त्रुटि !!!" की प्रतिक्रिया देखने के बजाय जैसा कि मुझे उम्मीद है कि मैं कंसोल पर "कुछ अपवाद" देखता हूं और फिर प्रक्रिया मारे जाती है। क्या यह त्रुटि प्रबंधन को सेटअप किया जाना चाहिए और यदि ऐसा है तो त्रुटियों को पकड़ने का एक और तरीका है?एक्सप्रेस जेएस त्रुटि हैंडलिंग

// Require Dependencies 
var express = require('express'); 
var app = express(); 

// Middleware 
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter) 
app.use(function(err, req, res, next) { 
    if(!err) return next(); // you also need this line 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

// Routes 
app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

// Listen 
app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 

उत्तर

23

एक उदाहरण एप्लिकेशन/त्रुटि हैंडलिंग पर गाइड हालांकि अपने कोड ठीक करना चाहिए https://expressjs.com/en/guide/error-handling.html पर उपलब्ध है क्योंकि आपके रूट से पहले आपके त्रुटि हैंडलर मिडलवेयर चलाया गया था, इसलिए त्रुटि हैंडलर को त्रुटि पास करने का मौका कभी नहीं मिला। इस शैली को निरंतर उत्तीर्ण के रूप में जाना जाता है। अपने त्रुटि हैंडलर को अंतिम रूप से मिडलवेयर स्टैक में रखें।

2) जब आपके पास एक अनचाहे त्रुटि होती है तो आपको सर्वर को बंद करना चाहिए। ऐसा करने के लिए सबसे अच्छा तरीका है server.close(), जहां सर्वर var server = http.createServer(app);

जिसका मतलब है ऐसा करने का परिणाम है कॉल करने के लिए है, तो आप कुछ इस तरह करना चाहिए:

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
    server.close(); 
}); 

तुम भी समय चाहिए शायद बाहर server.close(), के मामले में यह पूरा नहीं कर सकते (आपके ऐप्लिकेशन, सब के बाद एक अपरिभाषित राज्य में है):

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 

    server.close(); 

    setTimeout(function() { 
    process.exit(1); 
    }, 3*1000); 
}); 

मुझे लगता है कि आप के लिए यह सब करता है एक पुस्तकालय बनाया है, और आप कस्टम प्रतिक्रियाओं को परिभाषित, विशेष सहित की सुविधा देता है त्रुटि दृश्य, सेवा करने के लिए स्थिर फाइलें, आदि ...:

https://github.com/ericelliott/express-error-handler

+8

भविष्य के लोगों के लिए, app.router 3.x => 4.x माइग्रेशन प्रक्रिया के लिए बहिष्कृत किया गया है; https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x देखें। –

7

कुछ टिप्स::

1) आपका कोड काम नहीं कर रहा था

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

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 
+1

"आपको सर्वर बंद करना चाहिए"? क्यूं कर? नहीं! तुम्हे नही करना चाहिए! – fiatjaf

+0

यदि आपके पास एक अनचाहे त्रुटि है, तो आपको बिल्कुल सर्वर बंद करना चाहिए, क्योंकि त्रुटि ऐप को एक अनिर्धारित स्थिति में छोड़ सकती है - जिसका अर्थ है कि चीजें गलत हो सकती हैं। शट डाउन ऐप को एक स्थिर स्थिति में फिर से शुरू करके खुद को मरम्मत करने का मौका देता है। –

+0

इसलिए यदि किसी ने एक अनचाहे अपवाद ट्रिगर किया है, तो संपूर्ण ऐप सभी के लिए नीचे जाएगा?यह बेवकूफ – astroanu

2

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

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

मुझे :) के लिए काम किया

+0

मैं 3 '=' का उपयोग करने का सुझाव दूंगा, इसलिए यह सिर्फ अच्छे खरगोश के लिए चेक टाइप करें :) –

1

एक्सप्रेस स्थापित कर रहा है स्थापित करने के लिए कनेक्ट-डोमेन है, तो कुछ इस तरह:

var express = require("express"), 
    connectDomain = require("connect-domain"), 
    app = express(), 
    errorHandler; 

// हमारी त्रुटि हैंडलर

app.use(connectDomain()); 
    errorHandler = function (err, req, res, next) { 
     res.send(500, { 
      "status": "error", 
      "message": err.message 
     }); 
    console.log(err); 
}; 

फिर अपने एंडपॉइंट्स को सेट करते समय, tack errorHan डेलर अंत में उपयोग में():

app.get("/some/data", function (req, res) { 
    // ... do some stuff ... 
    res.send(200, "Yay! Happy Success!"); 
}).use(errorHandler); 
संबंधित मुद्दे