2013-05-23 10 views
8

Scenario: Si consideri che ho più metodi che eseguono compiti diversi e gestiti da diversi sviluppatori. Sto cercando di fare un metodo generico per chiamare quali registri se si verifica un errore. Quindi la necessità è che devo registrare una linea nome No, metodo, ecc ..Come ottenere un nome di metodo all'interno di un metodo node.js

ho scritto una funzione generica, come segue:

function enterLog(sourcefile, methodName, LineNo) 
    { 
      fs.appendFile('errlog.txt', sourcefile +'\t'+ methodName +'\t'+ LineNo +'\n', function(e){ 
      if(e) 
       console.log('Error Logger Failed in Appending File! ' + e); 
     }); 
    } 

Quindi, la chiamata per il metodo di cui sopra deve passare fonte file, nome del metodo e numero di riga che possono cambiare in qualsiasi momento durante lo sviluppo.

E.g. per il metodo di chiamare con i valori hard-coded:

enterLog('hardcodedFileName.js', 'TestMethod()', '27'); 

Domanda: E 'meglio codificare i valori (come sopra esempio) richiesto o non v'è alcun modo per ottenere il nome del metodo & linea di alcun riferimento da in qualche modo in Node.js?

+0

Controlla le discussioni qui: http://stackoverflow.com/questions/16324409/is-it-possible -for-a-javascript-function-to-return-its-own-function-call-as-a-st – NilsH

risposta

7

c'è un bel modulo là fuori che usiamo nel nostro logger di applicazioni. puoi anche recuperare il numero della linea. https://npmjs.org/package/traceback

così si potrebbe riscrivere così:

var traceback = require('traceback'); 

function enterLog(sourcefile, methodName, LineNo) { 
    var tb = traceback()[1]; // 1 because 0 should be your enterLog-Function itself 
    fs.appendFile('errlog.txt', tb.file +'\t'+ tb.method +'\t'+ tb.line +'\n', function(e) { 
    if(e) { 
     console.log('Error Logger Failed in Appending File! ' + e); 
    } 
    }); 
} 

e basta chiamare:

enterLog(); 

da dove vuoi e ottenere sempre i risultati corretti

Edit: un altro suggerimento. Non hardcoding il nome del file è il più facile da raggiungere in node.js senza 3rd-party-module-dipendenze:

var path = require('path'); 
var currentFile = path.basename(__filename); // where __filename always has the absolute path of the current file 
+0

molto utile .. Grazie –

+0

siete i benvenuti. un altro suggerimento che non ha molto a che fare con la tua domanda originale: prendi in considerazione lo streaming nel tuo log-file, perché fs.appendFile ha sempre bisogno di aprire il tuo file di log, scrivere su di esso e chiudere il file-handle: http: // nodejs. org/docs/latest/api/fs.html # fs_fs_createwritestream_path_options – hereandnow78

+0

Sembra che qualcosa sia rotto con questo esempio ora. Ottengo: /Users/chris/Desktop/Apps/repos/NetDb/Node.js/Node1/node_modules/traceback/lib/frame.js:26 frame.is_top = frame.isToplevel() ^ accesso illegale –

Problemi correlati