2013-11-09 12 views
14

मेरे पास एक Node.js सर्वर है जो बिना किसी त्रुटि संदेश को लॉग किए बिना लगातार क्रैश हो रहा है। क्या यह एक विशिष्ट परिदृश्य है? मैं त्रुटि को कैसे जा सकता हूं और क्रैश होने से पहले इसे लॉग कर सकता हूं?त्रुटि संदेश के बिना Node.js सर्वर क्रैश हो रहा है

+1

पर सूचना दी ध्यान में न आया अपवाद प्रवेश करने दुर्घटना के कारणों का पता लगाने के अलावा, आप को देखने के लिए जाँच कर सकते हैं अगर प्रक्रिया स्मृति से बाहर हो रही है। –

+1

क्या आप सर्वर के मेमोरी उपयोग की जांच करने के लिए एक तरीका सुझा सकते हैं? –

+0

जिस तरह से मैंने इसे दो साल पहले किया था वह मेरे नोड सर्वर को खोल से चलाने और stderr पर कब्जा करना था। उस समय V8 अनजाने में बाहर निकल जाएगा और stderr को एक त्रुटि संदेश लिख देगा। हालांकि, वी 8 बहुत बदल गया है, और मुझे नहीं पता कि वह तकनीक अब और काम करेगी या नहीं। मॉनिटरिंग प्रक्रिया मेमोरी मदद कर सकती है अगर दुर्घटना लंबे समय के बाद होती है। –

उत्तर

28

विवरणों को लॉग अप करने वाले अपवादों के लिए एक हैंडलर, आपके सर्वर के श्रोता को सेट करने से पहले, एक विशेष शुरुआत, विशेष रूप से उत्पादन में स्थापित करना होगा। here को देखो:

process.on('uncaughtException', function (exception) { 
    console.log(exception); // to see your exception details in the console 
    // if you are on production, maybe you can send the exception details to your 
    // email as well ? 
}); 

आप Express.js का उपयोग कर रहे हैं, तो, here पर एक नज़र डालें पता करने के लिए अपने त्रुटि से भरा ढेर देखते हैं कि कैसे करने के लिए (और अंत में, फिर उसे अपने ईमेल को भेजने के लिए यदि आप पर हैं उत्पादन)। उस मामले में, श्रोता instantiating इससे पहले कि आप पूरी जानकारी देने के लिए यह बताना:

var express = require('express'); 
// ... 
var app = express(); 
// ... 
app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
// then, set the listener and do your stuff... 
+6

'त्रुटि हैडलर' मिडलवेयर अब एक्सप्रेस के साथ बंडल नहीं किया गया है। आप इसे 'npm install errorhandler' को राइन करके इंस्टॉल कर सकते हैं - यहां विवरण देखें https://github.com/expressjs/errorhandler – muchweb

4

@matteofigus जवाब पूरा करने के लिए, आप भी listen for unhandled promise rejections कर सकते हैं।

process.on('unhandledRejection', (reason, p) => { 
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason); 
    // application specific logging, throwing an error, or other logic here 
}); 

somePromise.then((res) => { 
    return reportToUser(JSON.pasre(res)); // note the typo (`pasre`) 
}); // no `.catch` or `.then` 
0

आप लकड़हारा '(log4js-NPM-पैकेज) के साथ' errorhandler '& बुलाया मिडलवेयर का उपयोग आप सभी त्रुटि अपवाद के लिए लॉग रख सकते कर सकते हैं। एररहैंडर के लिए कोड यहां दिया गया है:

// मिडलवेयर: कैच-ऑल त्रुटि हैंडलर। ताकि हम त्रुटियों को लॉग कर सकें, लेकिन क्लाइंट को आंतरिक त्रुटि विवरण रिसाव न करें।

app.use(errorHandler); 

function errorHandler(err, req, res, next) { 

// XHR Request? 
if (req.xhr) { 
    logger.error(err); 
    res.status(500).send({ error: 'Internal Error Occured.' }); 
    return; 
} 

// Not a XHR Request. 
logger.error(err); 
res.status(500); 
res.render('framework/error', { error: "Internal Server Error." }); 

// Note: No need to call next() as the buck stops here. 
return; 
} 
0

नोड v6.11.0, विंडोज 10

कोई लाभ नहीं हुआ यहाँ अन्य सुझावों की कोशिश की - एप्लिकेशन बस बंद हो जाता है, कोई त्रुटि भी करने के लिए नीचे

process.on('uncaughtException',...) 
process.on('unhandledRejection',....) 

अंत में पता लगाया बाहर निकलें/दुर्घटना का उपयोग कर एक पुनरावर्ती समारोह कॉल। निम्नलिखित कोड समस्या का प्रदर्शन करता है;

"use strict" ; 

process.on('uncaughtException', function (exception) { 
    console.log(exception); 
}); 

var count = 0 ; 
function recursiveFunction(){ 
    console.log(count++); 
    recursiveFunction(); 
} 
recursiveFunction() ; 

यह अभी तक चलाएगा फिर बस रुक जाएगा। कोशिश करें/कैच या तो काम नहीं किया - ऊपर के रूप में कोशिश की;

function recursiveFunction(){ 
    console.log(count++); 
    try{ 
     recursiveFunction(); 
    } 
    catch(e){ 
     console.log("recursion error"); 
    } 
} 

फिर कुछ भी नहीं - बस बंद हो जाता है।

एक वर्कअराउंड (कोड को फिर से डिजाइन किए बिना) सेटइमीडिएट (रिकर्सन प्रक्रिया से बचने के लिए) का उपयोग करना है;

function recursiveFunction(){ 
    console.log(count++); 
    setImmediate(recursiveFunction); 
} 

(मैं अंत में इस इसे रोकने के लिए Ctrl-c'd।)

node github issues

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