2013-09-04 13 views
10

Ich frage mich, ob es eine beste Möglichkeit oder Best Practice gibt, um den vollständigen Pfad der Anwendung in Node.js zu erhalten. Beispiel: Ich habe ein Modul im Unterordner /apps/myapp/data/models/mymodel.js, und ich möchte den vollständigen Pfad der App (nicht vollständigen Pfad der Datei) erhalten, die mir zurückgeben wird/apps/myapp, wie mache ich das? Ich weiß, _ dirname oder _file ist nur relativ zu der Datei selbst, aber nicht den vollständigen Pfad der App.Holen Sie sich den vollständigen Anwendungspfad in Node.js

+2

ich meine eigene Antwort gefunden: path.dirname (process.mainModule.filename) –

Antwort

22

Es ist wahrscheinlich eine bessere Lösung, ABER dies sollte funktionieren:

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 eine bessere Lösung in den Kommentaren vorgeschlagen:

path.dirname(require.main.filename) 

EDIT: eine andere Lösung von Nam Nguyen

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

woo .. Ich habe das nicht kompliziert erwartet, aber ich werde es versuchen und danke. –

+0

'path.dirname (require.main.filename)' sollte genau dasselbe tun. Beachten Sie, dass diese (wie auch die OPs) Lösung fehlschlägt, wenn Sie die App über eine andere App ausführen (PM2, für immer oder Mocha sind häufige Fälle). –

+0

Wenn Sie dies in eine Funktion umwandeln wollen, und es an einem einzigen Ort (sagen wir 'common.js'), wird es ein Problem geben: Sie müssen den Speicherort von' common.js' kennen (relativ zum aktuellen Datei), so dass Sie 'require ('common.js')' 'verwenden können. Eigentlich wird '__dirname' das Problem niemals gut lösen. Ich denke, in Nodejs-Apps sollen Dateien * wissen, wo sie sind * und es gibt einfach keinen Grund für den Root-Pfad. –

3

Das funktionierte für mich .. Mit Supervisor läuft die App aus einem anderen Verzeichnis.

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

Beispiel .. Dateien: /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, funktioniert wie erwartet. Danke @John Williams –

+0

Ich habe auch eine andere Lösung gefunden: require ('path'). Dirname (process.mainModule.filename) –

Verwandte Themen