2013-01-05 20 views
36

किसी को फ़ंक्शन का नाम और रेखा कैसे प्राप्त हो सकती है जिसे वर्तमान कहा जाता है? मैं इस तरह एक अल्पविकसित डिबगिंग समारोह करना चाहते हैं (npmlog को परिभाषित करने log.debug के साथ):node.js में कॉलिंग फ़ंक्शन का नाम और रेखा प्राप्त करें

function debug() { 
    var callee, line; 
    /* MAGIC */ 
    log.debug(callee + ":" + line, arguments) 
} 

जब एक और समारोह से कहा जाता है यह कुछ इस तरह होगा:

function hello() { 
    debug("world!") 
} 
// outputs something like: 
// "hello:2 'world!'" 

स्पष्टता के लिए, जो मैं चाहता this in Python को अनिवार्य रूप से समान है:

import inspect 
def caller(): 
    return inspect.stack()[2][3] 
// line no from getframeinfo().lineno 

वहाँ एक नोड बराबर यह पूरा करने के है?

+1

यह उपयोगी हो सकता है, मैं एक ऐसी ही प्रश्न पूछा नहीं बल्कि संबंधित नोड: http://stackoverflow.com/questions/6885659/determining-source-line-and-file-of-function-reference-how -does-firebug-do-it –

उत्तर

43

यहां से जानकारी का उपयोग: Accessing line number in V8 JavaScript (Chrome & Node.js)

आप कुछ प्रोटोटाइप जोड़ सकते हैं यह करने के लिए पहुँच प्रदान करने के वी 8 से जानकारी:

Object.defineProperty(global, '__stack', { 
get: function() { 
     var orig = Error.prepareStackTrace; 
     Error.prepareStackTrace = function(_, stack) { 
      return stack; 
     }; 
     var err = new Error; 
     Error.captureStackTrace(err, arguments.callee); 
     var stack = err.stack; 
     Error.prepareStackTrace = orig; 
     return stack; 
    } 
}); 

Object.defineProperty(global, '__line', { 
get: function() { 
     return __stack[1].getLineNumber(); 
    } 
}); 

Object.defineProperty(global, '__function', { 
get: function() { 
     return __stack[1].getFunctionName(); 
    } 
}); 

function foo() { 
    console.log(__line); 
    console.log(__function); 
} 

foo() 

क्रमश: '28' और 'foo' देता है।

+1

धन्यवाद जो।शायद '__line' और' __ कार्यक्षमता 'का नाम बेहतर हो सकता है' __parent_line' और '__parent_function_name', लेकिन अन्यथा यह बहुत अच्छा है (और यह संयोग से, मेरे जवाब में 'स्टैक-ट्रेस' कैसे काम करता है)। –

+0

वे दूसरे फ्रेम का उपयोग करते हैं अन्यथा आपको केवल __line और __ कार्यक्षमता के बारे में जानकारी मिल जाएगी। :) 'स्टैक-ट्रेस' पर दिलचस्प देखना होगा। – Joe

+0

हालांकि यह समाधान बहुत अच्छा है, यह महंगा है। मैं इसे उत्पादन कोड में उपयोग नहीं करता। यदि आप बुनियन लॉगर का उपयोग करते हैं, तो आप [src विकल्प] चालू कर सकते हैं (https://github.com/trentm/node-bunyan#src)। लेकिन फिर, वे उत्पादन कोड के लिए उस विकल्प की भी सिफारिश नहीं करते हैं। मुझे एक ट्रांसपेलर पसंद आएगा जो मेरे कोड को चलाने से पहले प्रत्येक लॉगर कॉल को फ़ंक्शन नाम और लाइन नंबर के बारे में जानकारी के साथ प्रतिस्थापित कर सकता है। किसी को?? – Vibgy

12

मैंने पाया और node-stack-trace मॉड्यूल (npm install stack-trace के साथ स्थापित) स्थापित करें, और तब के रूप में परिभाषित किया गया echo:

function echo() { 
    var args, file, frame, line, method; 
    args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; 

    frame = stackTrace.get()[1]; 
    file = path.basename(frame.getFileName()); 
    line = frame.getLineNumber(); 
    method = frame.getFunctionName(); 

    args.unshift("" + file + ":" + line + " in " + method + "()"); 
    return log.info.apply(log, args); // changed 'debug' to canonical npmlog 'info' 
}; 
+0

यह बहुत अच्छा है, क्योंकि अन्य लोग उपरोक्त रेखाओं को इस में बदलते हैं: args = 1 <= arguments.length? [] .slice.call (तर्क, 0): []; वापसी console.log.apply (यह, तर्क); – Kus

+0

धन्यवाद, मैं टाइटेनियम चला रहा हूं और इस फ़ंक्शन को संदेश की उत्पत्ति लॉग करने के लिए मिला: '' 'फ़ंक्शन लॉग (msg) { स्टैकट्रेस = आवश्यकता (" स्टैक-ट्रेस/lib/stack-trace "); var thistrace = stackTrace.get(); var parent_name = thistrace [1] .getFunctionName(); var parent_eval = thistrace [1] .getEvalOrigin(); msg = sprintf ("[% s] [% s]:% s", parent_eval, parent_name, msg); Ti.API.info (msg); } '' ' –

9

मुझे भी इसी तरह की आवश्यकता थी। मैंने नोडज द्वारा प्रदान की गई त्रुटि वर्ग की स्टैक प्रॉपर्टी का उपयोग किया।
मैं अभी भी नोड सीख रहा हूं, त्रुटि की संभावना हो सकती है।

नीचे इसके लिए स्पष्टीकरण दिया गया है। उसी के लिए इसके अलावा बनाई NPM मॉड्यूल, यदि आप चाहें, तो आप जाँच कर सकते हैं पर:
1. npm module 'logat'
2. git repo

हम विधि के साथ 'लॉग इन करें'

var logger = { 
log: log 
} 
function log(msg){ 
    let logLineDetails = ((new Error().stack).split("at ")[3]).trim(); 
    console.log('DEBUG', new Date().toUTCString(), logLineDetails, msg); 
} 

'लकड़हारा' वस्तु लगता है उदाहरण:

//suppose file name: /home/vikash/example/age.js 
function getAge(age) { 
    logger.log('Inside getAge function'); //suppose line no: 9 
} 

ऊपर उदाहरण के आउटपुट:

DEBUG on Sat, 24 Sept 2016 12:12:10 GMT at getAge(/home/vikash/example/age.js:9:12) 
    Inside getAge function 
संबंधित मुद्दे