2013-04-04 6 views
29

मैं bodyParser() मिडलवेयर से त्रुटि को पकड़ने के लिए जब मैं एक json वस्तु भेज चाहते हैं और यह अमान्य है क्योंकि मैं एक सामान्य 400 त्रुटि के बजाय कोई कस्टम प्रतिक्रिया भेजना चाहते हैं।पकड़ने एक्सप्रेस bodyParser त्रुटि

यह है कि मैं क्या है और यह काम करता है:

app.use (express.bodyParser()); 
app.use (function (error, req, res, next){ 
    //Catch bodyParser error 
    if (error.message === "invalid json"){ 
     sendError (res, myCustomErrorMessage); 
    }else{ 
     next(); 
    } 
}); 

लेकिन क्योंकि मैं जो भविष्य एक्सप्रेस संस्करणों में बदल सकता है त्रुटि संदेश तुलना कर रहा हूं यह एक बहुत ही बदसूरत दृष्टिकोण मुझे लगता है। BodyParser() त्रुटियों को पकड़ने का कोई और तरीका है?

संपादित करें:

{ 
    stack: 'Error: invalid json\n at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13)\n at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71)\n at IncomingMessage.EventEmitter.emit (events.js:92:17)\n at _stream_readable.js:872:14\n at process._tickDomainCallback (node.js:459:13)', 
    arguments: undefined, 
    type: undefined, 
    message: 'invalid json', 
    status: 400 
} 

सुंदर मुद्रित ढेर:

Error: invalid json 
    at Object.exports.error (<path>/node_modules/express/node_modules/connect/lib/utils.js:55:13) 
    at IncomingMessage.<anonymous> (<path>/node_modules/express/node_modules/connect/lib/middleware/json.js:74:71) 
    at IncomingMessage.EventEmitter.emit (events.js:92:17) 
    at _stream_readable.js:872:14 
    at process._tickDomainCallback (node.js:459:13) 

उत्तर

5

ठीक है, इसे मिला:

bodyParser() json(), urlencoded() और multipart() के लिए एक सुविधाजनक कार्य है। मैं सिर्फ) json (करने के लिए कहते हैं, त्रुटि को पकड़ने और() और बहुखण्डीय() urlencoded को कॉल करने के लिए की जरूरत है।

bodyParser source

app.use (express.json()); 
app.use (function (error, req, res, next){ 
    //Catch json error 
    sendError (res, myCustomErrorMessage); 
}); 

app.use (express.urlencoded()); 
app.use (express.multipart()); 
+4

यह एक समाधान नहीं है। आप इस बात पर विचार नहीं करते कि इस कोड से पहले एक और मिडलवेयर हो सकता है।यदि आप इस तरह के कुछ अपवाद को पकड़ते हैं तो इससे अप्रत्याशित स्थिति हो सकती है। कम से कम यह लिखना बेहतर है: 'app.use (फ़ंक्शन (त्रुटि, req, res, अगला) {/ * शटडाउन नोड * /}; app.use (bodyParser.json()); app.use (फ़ंक्शन (त्रुटि, req, res, next) {/ * if.status == 4 ** फिर json त्रुटि => res.status (400) .send(), अन्यथा शट डाउन नोड * /}); – Dao

+4

डेंजर डेंजर, यह कैच उपरोक्त मिडलवेयर में कोई त्रुटि, जैसा कि @ दाओ ने कहा। असुर – light24bulbs

17

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव के लिए जाँच करने के लिए है

यह जब अनुरोध शरीर में अमान्य JSON है त्रुटि है SyntaxError:

app.use(function (error, req, res, next) { 
    if (error instanceof SyntaxError) { 
    sendError(res, myCustomErrorMessage); 
    } else { 
    next(); 
    } 
}); 
+0

क्योंकि यह एक सिंटैक्स त्रुटि नहीं है यह काम नहीं करता का एक उदाहरण के साथ। प्रश्न अद्यतन देखें। –

+0

@ गैब्रियललैमास एक्सप्रेस के नवीनतम संस्करण (4.6.1) के साथ 'बॉडीपार्सर' मॉड्यूल अब अंतर्निहित नहीं है, इसे अपने [मॉड्यूल] में स्थानांतरित कर दिया गया है (https://github.com/expressjs/body-parser) और कहा कि वास्तव में विकृत JSON के लिए एक 'SyntaxError' फेंक देता है। – James

+2

हैं अनुरोध शरीर बहुत बड़ी है, हालांकि, आप एक त्रुटि एक सिंटैक्स त्रुटि के बजाय मिल जाएगा। उदाहरण के लिए: '{[त्रुटि: अनुरोध इकाई बहुत बड़ी] प्रकार: 'entity.too.large', संदेश: 'अनुरोध इकाई बहुत बड़ी', statusCode: 413, की स्थिति: 413, की उम्मीद: 322,350, लंबाई: 322350, सीमा: 102400} ' –

1

मैं SyntaxError के लिए जाँच के लिए पर्याप्त नहीं हो पाया है, इसलिए मुझे क्या करना:

if (err instanceof SyntaxError && 
    err.status >= 400 && err.status < 500 && 
    err.message.indexOf('JSON')) { 
    // process filtered exception here 
} 
1
(bodyParser, req, res) => new Promise((resolve, reject) => { 
    try { 
     bodyParser(req, res, err => { 
      if (err instanceof Error) { 
       reject(err); 
      } else { 
       resolve(); 
      } 
     }); 
    } catch (e) { 
     reject(e); 
    } 
}) 

बुलेट प्रूफ। भविष्य अवगत। WTFPL-लाइसेंस। और उपयोगी w/async/प्रतीक्षा भी।

+0

मैं इस फ़ंक्शन को अपने ऐप में इसके बाद मिडलवेयर के रूप में कैसे प्लग करूं? मैं कोड कहां डाल सकता हूं जो वास्तव में त्रुटि का जवाब देता है? यह क्या कर रहा है? – PoolOfPeas

0

@alexander के जवाब से लेकिन ussage

app.use((req, res, next) => { 
    bodyParser.json({ 
     verify: addRawBody, 
    })(req, res, (err) => { 
     if (err) { 
      console.log(err); 
      res.sendStatus(400); 
      return; 
     } 
     next(); 
    }); 
}); 

function addRawBody(req, res, buf, encoding) { 
    req.rawBody = buf.toString(); 
} 
संबंधित मुद्दे