2013-09-04 17 views
10

Mi chiedo se esiste un modo migliore o una procedura ottimale per ottenere il percorso completo dell'applicazione in Node.js. Esempio: ho un modulo nella sotto cartella /apps/myapp/data/models/mymodel.js e vorrei ottenere il percorso completo dell'app (non il percorso completo del file), che mi restituirà /apps/myapp, come faccio? Lo so _ dirname o _file è relativo solo al file stesso ma non al percorso completo dell'app.Ottieni il percorso completo dell'applicazione in Node.js

+2

ho trovato la mia risposta: path.dirname (process.mainModule.filename) –

risposta

22

C'è probabilmente una soluzione migliore, MA questo dovrebbe funzionare:

var path = require('path'); 

// find the first module to be loaded 
var topModule = module; 

while(topModule.parent) 
    topModule = topModule.parent; 

var appDir = path.dirname(topModule.filename); 
console.log(appDir); 

EDIT: Andreas ha proposto una soluzione migliore nei commenti:

path.dirname(require.main.filename) 

EDIT: un'altra soluzione di Nam Nguyen

path.dirname(process.mainModule.filename) 
+0

woo .. Non mi aspettavo che fosse complicato, ma lo proverò e grazie. –

+0

'path.dirname (require.main.filename)' dovrebbe fare esattamente la stessa cosa. Si noti che questa soluzione (così come quella dell'OP) non funzionerà se si esegue l'app tramite un'altra app (pm2, per sempre o mocha che sono casi comuni). –

+0

Se vuoi trasformare questa funzione in una funzione e metterla in un unico posto (ad esempio 'common.js'), ci sarà un problema: devi conoscere la posizione di' common.js' (relativa all'attuale file) in modo da poter usare 'require ('common.js')'. In realtà '__dirname' non risolverà mai bene il problema. Penso che nelle app di nodejs, i file dovrebbero sapere * dove sono * e non c'è semplicemente bisogno del percorso di root. –

3

Questo ha funzionato per me .. Con supervisore che esegue l'app da una directory diversa.

require('path').dirname(Object.keys(require.cache)[0]) 

esempio .. file: /desktop/ya/node.js

require('./ya2/submodule')(); 

/desktop/ya/ya2/submodule.js

module.exports = function(){ 
    console.log(require('path').dirname(Object.keys(require.cache)[0])) 
} 

$ node node.js 
     => /desktop/ya 

$ (from /desktop) supervisor ya/node.js 
     => /desktop/ya 
+0

yeup, funziona come previsto. Grazie a @John Williams –

+0

ho trovato anche un'altra soluzione: require ('path'). Dirname (process.mainModule.filename) –

Problemi correlati