Solución:
Hay varias formas de abordar esto, cada una con sus pros y sus contras:
require.main.filename
De http://nodejs.org/api/modules.html:
Cuando un archivo se ejecuta directamente desde Node,
require.main
está configurado en sumodule
. Eso significa que puede determinar si un archivo se ha ejecutado directamente probandorequire.main === module
Porque
module
provee unfilename
propiedad (normalmente equivalente a__filename
), el punto de entrada de la aplicación actual se puede obtener marcandorequire.main.filename
.
Entonces, si desea el directorio base para su aplicación, puede hacer:
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 lanzador como pm2 o corriendo moca pruebas, 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 de su aplicación. Entonces, en tu index.js
(o app.js
o cualquiera que sea el nombre de su archivo de aplicación principal), 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 confiable en absoluto, ya que depende completamente del directorio en el que se inició el proceso. 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
ruta-raíz-de-aplicación
Para abordar este problema, he creado un módulo de nodo llamado ruta-raíz-de-aplicación. El uso es simple:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
los ruta-raíz-de-aplicación El módulo 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 ejecuta en /var/www/
pero el módulo está instalado en ~/.nvm/v0.x.x/lib/node/
). No funcionará el 100% del tiempo, pero funcionará en la mayoría de los escenarios comunes.
Pros contras
Funciona sin configuración en la mayoría de circunstancias. También proporciona algunos buenos métodos de conveniencia adicionales (consulte la 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 de la aplicación
node_modules
directorio (por ejemplo, si lo instaló globalmente)
Puede evitar esto configurando un APP_ROOT_PATH
variable ambiental, o llamando .setPath()
en el módulo, pero en ese caso, probablemente sea mejor usar el global
método.
Variable de entorno NODE_PATH
Si estás 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 los módulos de la aplicación de manera confiable, le recomiendo encarecidamente que busque en el NODE_PATH
variable ambiental.
El sistema de módulos de Node busca módulos en una variedad de ubicaciones. Una de estas ubicaciones es donde sea process.env.NODE_PATH
puntos. Si establece esta variable de entorno, puede require
módulos con el cargador de módulos estándar sin ningún otro cambio.
Por ejemplo, si configura NODE_PATH
para /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 puede iniciar su aplicación con npm start
y tu eres dorado Combino esto con mi módulo enforce-node-path, que evita cargar accidentalmente la aplicación sin NODE_PATH
colocar. Para obtener aún más control sobre el cumplimiento de las variables ambientales, consulte checkenv.
Uno te tengo: NODE_PATH
debe estar listo fuera de de la aplicación de nodo. No puedes hacer algo como 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 la aplicación.
[added 4/6/16] Otro módulo realmente prometedor que intenta solucionar este problema es el ondulado.
__dirname
no es global; es local al módulo actual, por lo que cada archivo tiene su propio valor local y diferente.
Si desea el directorio raíz del proceso en ejecución, probablemente desee usar process.cwd()
.
Si desea previsibilidad y confiabilidad, entonces probablemente deba hacer que sea un requisito de su aplicación que se establezca una determinada variable de entorno. Tu aplicación busca MY_APP_HOME
(O lo que sea) y si está allí, y la aplicación existe en ese directorio, entonces todo está bien. Si no está definido o el directorio no contiene su aplicación, entonces debería salir con un error pidiendo al usuario que cree la variable. Podría configurarse como parte de un proceso de instalación.
Puede leer las variables de entorno en el nodo con algo como process.env.MY_ENV_VARIABLE
.
1- crea un archivo en la raíz del proyecto llámalo settings.js
2- dentro de este archivo agrega este código
module.exports = {
POST_MAX_SIZE : 40 , //MB
UPLOAD_MAX_FILE_SIZE: 40, //MB
PROJECT_DIR : __dirname
};
3- dentro de node_modules crea un nuevo módulo con el nombre de “configuración” y dentro del módulo index.js escribe este código:
module.exports = require("../../settings");
4- y en cualquier momento que desee el directorio de su proyecto solo use
var settings = require("settings");
settings.PROJECT_DIR;
de esta manera tendrás todos los directorios del proyecto relativos a este archivo;)