क्या किसी को पता है कि Node.js में स्टैक ट्रेस कैसे प्रिंट करें?
क्या किसी को पता है कि Node.js में स्टैक ट्रेस कैसे प्रिंट करें?
जवाबों:
किसी भी Errorवस्तु में एक stackसदस्य होता है जो उस बिंदु पर फंस जाता है जिस पर इसका निर्माण किया गया था।
var stack = new Error().stack
console.log( stack )
या अधिक बस:
console.trace("Here I am!")
'util'।
new Error().stack, जो उन मामलों में काम करता है जहां आप कंसोल को शामिल नहीं करना चाहते हैं।
traceयह है कि यह वर्तमान लाइन / संदर्भ को दर्शाता है जो stackऐसा नहीं करता है। जानकारी त्रुटि ऑब्जेक्ट में है यदि आप मैन्युअल रूप से उस पंक्ति को बनाना चाहते हैं जो मुझे लगता है।
अब इसके लिए कंसोल पर एक समर्पित कार्य है:
console.trace()
console.trace()।
--stack_trace_limit=200
जैसा कि पहले ही उत्तर दिया गया है, आप केवल ट्रेस कमांड का उपयोग कर सकते हैं :
console.trace("I am here");
हालाँकि, यदि आप इस प्रश्न पर आते हैं कि किसी अपवाद के स्टैक ट्रेस को कैसे लॉग किया जाए , तो आप केवल अपवाद ऑब्जेक्ट को लॉग इन कर सकते हैं।
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
यह लॉग करेगा:
त्रुटि: कुछ अप्रत्याशित हुआ है।
मुख्य (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
ऑब्जेक्ट पर। (c: \ Users \ Me \ Documents \ MyApp \ app.js: 17: 1)
Module._compile (मॉड्यूल.js: 460: 26)
पर Object.Module._extensions..js (मॉड्यूल.js: 478: 10) )
पर Module.load (module.js: 355: 32)
Function.Module._load (module.js पर: 310: 12)
Function.Module.runMain (module.js पर: 501: 10)
स्टार्टअप (Node.js पर : 129: 16)
नोड.जेएस पर: 814: 3
यदि आपका Node.js संस्करण 6.0.0 से अधिक है , तो एक्सेप्शन ऑब्जेक्ट को लॉग करना पर्याप्त नहीं होगा। इस मामले में, यह केवल प्रिंट करेगा:
[त्रुटि: कुछ अप्रत्याशित हुआ है।]
नोड संस्करण <6 के लिए, त्रुटि संदेश प्रिंट करने के console.error(e.stack)बजाय console.error(e)पूर्ण स्टैक का उपयोग करें, जैसे वर्तमान नोड संस्करण करता है।
नोट: यदि अपवाद को स्ट्रिंग के रूप में बनाया जाता है throw "myException", तो स्टैक ट्रेस और लॉगिंग e.stackपैदावार को अपरिभाषित करना संभव नहीं है ।
सुरक्षित होने के लिए, आप उपयोग कर सकते हैं
console.error(e.stack || e);
और यह पुराने और नए Node.js संस्करणों के लिए काम करेगा।
console.error(e) प्रिंट नहीं होगा , सहित ? ee.stack
Errorकंसोल के स्टैकट्रेस को अधिक पठनीय तरीके से प्रिंट करने के लिए:
console.log(ex, ex.stack.split("\n"));
उदाहरण परिणाम:
[Error] [ 'Error',
' at repl:1:7',
' at REPLServer.self.eval (repl.js:110:21)',
' at Interface.<anonymous> (repl.js:239:12)',
' at Interface.EventEmitter.emit (events.js:95:17)',
' at Interface._onLine (readline.js:202:10)',
' at Interface._line (readline.js:531:8)',
' at Interface._ttyWrite (readline.js:760:14)',
' at ReadStream.onkeypress (readline.js:99:10)',
' at ReadStream.EventEmitter.emit (events.js:98:17)',
' at emitKey (readline.js:1095:12)' ]
आसानी से उपलब्ध नोड मॉड्यूल के साथ, नोड से पूर्ण-लंबाई स्टैक निशान प्राप्त करना संभव है (मामूली प्रदर्शन दंड के साथ यद्यपि): http://www.mattinsler.com/post/26396305882/announcing-longnohn-long-stack -traces के लिए नोड js
Error.captureStackTrace (targetObject [, constructorOpt]) की कोशिश करें ।
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
फ़ंक्शन aऔर bत्रुटि स्टैक में कैप्चर किए जाते हैं और संग्रहीत होते हैं myObj।
stackसंपत्ति चाहते हैं, तो आपको इसे कॉल करना होगा यदि Node> = 6 Error.captureStackTrace(error):।
Error.captureStackTraceस्टैक ट्रेस में दिखाने के लिए बुलाया गया है, तो आप इसे constructorOptआर्ग के रूप में पास करके इसे छोड़ सकते हैं ।
मैं जानता हूं कि नोडज में पूर्ण स्टैक ट्रेस को प्रिंट करना संभव नहीं है, आप बस एक "आंशिक" स्टैक ट्रेस को प्रिंट कर सकते हैं, आप यह नहीं देख सकते हैं कि आप कोड में कहां से आए थे, बस जहां अपवाद होता है। यही रयान डाहल इस यूट्यूब वीडियो में बताते हैं। http://youtu.be/jo_B4LTHi3I सटीक होने के लिए न्यूनतम 56:30 मिनट। उम्मीद है की यह मदद करेगा
@ आइसाक्स का उत्तर सही है, लेकिन यदि आपको अधिक विशिष्ट या क्लीनर त्रुटि स्टैक की आवश्यकता है , तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
यह फ़ंक्शन सीधे फ़ंक्शन से प्रेरित console.traceहै NodeJS ।
स्रोत कोड: हाल का संस्करण या पुराना संस्करण ।
err.stackअधिक सही उत्तर है।
यदि आप केवल त्रुटि के स्टैक ट्रेस लॉग करना चाहते हैं (और त्रुटि संदेश नहीं) नोड 6 और इसके बाद के संस्करण में स्वचालित रूप से स्टैक ट्रेस के अंदर त्रुटि नाम और संदेश शामिल है, जो कि कुछ कस्टम त्रुटि हैंडलिंग करना चाहते हैं तो थोड़ा कष्टप्रद है:
console.log(error.stack.replace(error.message, ''))
यह समाधान केवल त्रुटि नाम और स्टैक ट्रेस लॉग करेगा (इसलिए आप उदाहरण के लिए, त्रुटि संदेश को प्रारूपित कर सकते हैं और इसे प्रदर्शित कर सकते हैं कि आप अपने कोड में कहीं और कैसे चाहते हैं)।
उपरोक्त उदाहरण, स्टैक ट्रेस द्वारा केवल त्रुटि नाम का अनुसरण करेगा, उदाहरण के लिए:
Error:
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
के बजाय:
Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.
Did you mean this?
rev-list
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
मामले में कोई अभी भी इस तरह की तलाश में है जैसे मैं था, तो एक मॉड्यूल है जिसे हम "स्टैक-ट्रेस" नामक उपयोग कर सकते हैं। यह वास्तव में लोकप्रिय है।एनपीएम लिंक
फिर ट्रेस के माध्यम से चलो।
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
या बस ट्रेस प्रिंट करें:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
आप नोड-स्टैक-ट्रेस मॉड्यूल का उपयोग कर सकते हैं जो कॉल स्टैक को ट्रैक करने के लिए एक पावर फुल मॉड्यूल है।
sys.puts(new Error().stack)(सिस्टम मॉड्यूल को जोड़ने के बाद)