Hay varias formas de abordar esto, cada una con sus propios pros y contras:
require.main.filename
De http://nodejs.org/api/modules.html :
Cuando un archivo se ejecuta directamente desde Node, require.mainse establece en su module. Eso significa que puede determinar si un archivo se ha ejecutado directamente mediante pruebasrequire.main === module
Debido a que moduleproporciona una filenamepropiedad (normalmente equivalente a __filename), el punto de entrada de la aplicación actual se puede obtener marcando require.main.filename.
Entonces, si desea el directorio base para su aplicación, puede hacer lo siguiente:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Pros contras
Esto funcionará muy bien la mayor parte del tiempo, pero si está ejecutando su aplicación con un iniciador como pm2 o ejecutando pruebas de mocha , este método fallará.
global.X
El nodo tiene un objeto de espacio de nombres global llamado global: todo lo que adjunte a este objeto estará disponible en todas partes en su aplicación. Entonces, en su index.js(o app.jscomo se llame el archivo principal de su aplicación), puede definir una variable global:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Pros contras
Funciona de manera consistente, pero debe confiar en una variable global, lo que significa que no puede reutilizar fácilmente los componentes, etc.
process.cwd ()
Esto devuelve el directorio de trabajo actual. No es fiable en absoluto, ya que es totalmente dependiente de qué directorio el proceso se puso en marcha a partir de :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
app-root-path
Para solucionar este problema, he creado un módulo de nodo llamado app-root-path . El uso es simple:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
El módulo app-root-path utiliza varias técnicas diferentes para determinar la ruta raíz de la aplicación, teniendo en cuenta los módulos instalados globalmente (por ejemplo, si su aplicación se está ejecutando /var/www/pero el módulo está instalado ~/.nvm/v0.x.x/lib/node/). No funcionará el 100% del tiempo, pero funcionará en los escenarios más comunes.
Pros contras
Funciona sin configuración en la mayoría de las circunstancias. También proporciona algunos buenos métodos de conveniencia adicionales (ver página del proyecto) La mayor desventaja es que no funcionará si:
- Estás usando un lanzador, como pm2
- Y , el módulo no está instalado dentro del
node_modulesdirectorio de su aplicación (por ejemplo, si lo instaló globalmente)
Puede solucionar esto configurando una APP_ROOT_PATHvariable ambiental o llamando .setPath()al módulo, pero en ese caso, probablemente sea mejor usar el globalmétodo.
NODE_PATH variable ambiental
Si está buscando una manera de determinar la ruta raíz de la aplicación actual, es probable que una de las soluciones anteriores funcione mejor para usted. Si, por otro lado, está tratando de resolver el problema de cargar módulos de aplicaciones de manera confiable, le recomiendo que analice la NODE_PATHvariable ambiental.
El sistema de módulos de nodo busca módulos en una variedad de ubicaciones. Una de estas ubicaciones es donde process.env.NODE_PATHapunta . Si configura esta variable de entorno, puede requiremodificar los módulos con el cargador de módulos estándar sin ningún otro cambio.
Por ejemplo, si establece NODE_PATHen /var/www/lib, lo siguiente funcionaría bien:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Una excelente manera de hacer esto es usar npm:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Ahora puedes iniciar tu aplicación con npm starty eres dorado. Combino esto con mi módulo enforce-node-path , que evita cargar accidentalmente la aplicación sin NODE_PATHconfigurarla. Para obtener aún más control sobre la aplicación de variables ambientales, consulte checkenv .
One gotcha: NODE_PATH must establecerse fuera de la aplicación del nodo. No puede hacer algo así process.env.NODE_PATH = path.resolve(__dirname)porque el cargador de módulos almacena en caché la lista de directorios que buscará antes de que se ejecute su aplicación.
[añadido 4/6/16] Otro módulo realmente prometedor que intenta resolver este problema es ondulado .