Saltar al contenido

Determine la raíz del proyecto desde una aplicación node.js en ejecución

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 su module. Eso significa que puede determinar si un archivo se ha ejecutado directamente probando require.main === module

Porque module provee un filename propiedad (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:

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;)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *