2012-05-22 12 views
29

Ahora, cada vez que deseo implementar un servidor node.js en mi servidor de producción, necesito cambiar toda la IP/DNS/nombre de usuario/contraseña para mi conexión múltiple a mis bases de datos y API externas.Verificar si mi instancia de node.js es dev o producción

Este proceso es molesto, ¿hay alguna manera de verificar si la instancia actualmente en ejecución node.js está en cloud9ide o en realidad es my producción joyent smartmachine?

Si soy capaz de detectar (en mi código de ejecución) en qué servidor se está ejecutando mi instancia de node.js, añadiré una condición que establezca los valores en el prod o dev.

Gracias

+0

¿Su aplicación node.js es un servidor HTTP? –

+0

Sí lo es. También tiene una conexión con mongodb. – guiomie

Respuesta

44

Normalmente, debe ejecutar una aplicación de nodo en la producción de la siguiente manera:

NODE_ENV=production node app.js

aplicaciones con Express, Socket.IO y otros usos process.env.NODE_ENV de averiguar el medio ambiente.

En desarrollo, puede omitir eso y ejecutar la aplicación normalmente con node app.js.

Puede detectar el medio ambiente en su código como este:

var env = process.env.NODE_ENV || 'dev'; 
loadConfigFile(env + '.json', doStuff); 

Recursos:

How do you detect the environment in an express.js app?

+3

En Express 3.x y 4.x, la variable env se establece por expreso mismo [aquí] (https://github.com/visionmedia/express/blob/master/lib/application.js#L52) para 'desarrollo '. – Ryley

9

Creo que la forma más sencilla de configurar el entorno es pasar argumentos de línea de comandos para su aplicación.

node ./server.js dev 

En su secuencia de comandos, necesita manejar este argumento y establecer la configuración de lo que necesita.

var env = process.argv[2] || 'dev'; 
switch (env) { 
    case 'dev': 
     // Setup development config 
     break; 
    case 'prod': 
     // Setup production config 
     break; 
} 

También, i se ha creado module que hace que el proceso de configuración un poco más fácil. Tal vez te ayude.

+1

+1 Esto le permite crear múltiples configuraciones, desde el desarrollo hasta la etapa de producción. –

2

En realidad, no lo recomendaría para almacenar los valores de configuración como información de conexión de base de datos, contraseñas, tokens de acceso y tal dentro del código de la aplicación real por las siguientes razones:

  1. La codificación rígida de esos valores hace que sea difícil cambiarlos más adelante. Deberá lanzar una nueva versión de la aplicación para cambiar esos valores.

  2. Se trata de una infracción de seguridad grave, ya que los datos de configuración de nivel de producción y las contraseñas no se deben almacenar en el código. Es muy fácil filtrar esta información confidencial.

El mejor enfoque sería externalizar esta información y pasarla a su aplicación durante la ejecución. Esto normalmente se hace por medio de variables de entorno. Solo necesita definir una variable de entorno única para cada paz de datos que debe poder cambiarse entre diferentes entornos.

Por ejemplo: DB_HOST, DB_USER, DB_PASSWORD.Posteriormente, se podría pasar esos valores a los que la aplicación en la producción de esta manera:

$ NODE_ENV=production DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword /bin/node app.js 

En realidad, estos valores podrían ser encriptados y se añaden a la base de código y luego descifrados durante el despliegue. Sin embargo, asegúrese de que la clave de descifrado esté almacenada de forma segura en el sistema de implementación o que el ingeniero de versiones la proporcione de forma interactiva. Shippable allows to do this fuera de la caja.

En el entorno de desarrollo se vuelve más simple, porque puede usar dotenv module muy conveniente. Basta con crear un archivo .env en el directorio raíz de su proyecto y añadir todas las variables a ella:

DB_HOST=1.2.3.4 
DB_USER=someusername 
DB_PASSWORD=somerandompassword 

Pero, asegúrese de excluirlo de ustedes VCS, ya que cada desarrollador probablemente querría tener configuración personal. Puede crear un archivo .env.dist para contener la configuración predeterminada, que luego se podría usar como plantilla: cp .env.dist .env.


Además, he implementado un módulo reutilizable, que permite detectar automáticamente el medio ambiente mediante el análisis de los dos argumentos de la CLI y la variable NODE_ENV. Esto podría ser útil en su máquina de desarrollo, porque puede cambiar fácilmente el entorno pasando un argumento CLI a su programa Node.js como este: $ node app.js --prod. También es bueno usarlo con Gulp: $ gulp build --prod.

Por favor, ver más detalles y casos de uso en el detect-environment's page.

Cuestiones relacionadas