¿Qué es NODE_ENV y cómo usarlo en Express?

184

Esta es mi aplicación, actualmente estoy en producción.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

Sin embargo, llegué a conocerlo NODE_ENVy quiero usarlo. ¿Cómo puedo hacer esto?

TIMEX
fuente
En su caso, supongo que lo que puede usar es app.configure('development', ...)"producción" para establecer ciertas configuraciones solo para entornos de desarrollo o producción. Ver expressjs.com/api.html#app.configure
Andreas Hultgren

Respuestas:

360

NODE_ENVes una variable de entorno popularizada por el framework express web server. Cuando se ejecuta una aplicación de nodo, puede verificar el valor de la variable de entorno y hacer diferentes cosas según el valor. NODE_ENVespecíficamente se usa (por convención) para indicar si un entorno particular es un entorno de producción o de desarrollo . Un caso de uso común es ejecutar código de depuración o registro adicional si se ejecuta en un entorno de desarrollo.

Accediendo a NODE_ENV

Puede usar el siguiente código para acceder a la variable de entorno usted mismo para que pueda realizar sus propias verificaciones y lógica:

var environment = process.env.NODE_ENV

O, alternativamente, usando express ' app.get('env')( nota: esto está predeterminado a "development")

Tenga en cuenta que si no lo ha configurado explícitamente NODE_ENVpara su entorno, lo será undefined.

Configurando NODE_ENV

Cómo configurar realmente la variable de entorno varía de un sistema operativo a otro, y también depende de la configuración del usuario.

Si desea establecer la variable de entorno como única, puede hacerlo desde la línea de comandos:

  • linux y mac :export NODE_ENV=production
  • ventanas :$env:NODE_ENV = 'production'

A largo plazo, debe persistir esto para que no se desarme si reinicia, en lugar de enumerar todos los métodos posibles para hacerlo, ¡le dejaré buscar cómo hacerlo usted mismo!

La convención ha dictado que solo hay dos valores que debe usar para NODE_ENV, productiono bien development, todos en minúscula. No hay nada que le impida agregar más valores, pero probablemente no sea una buena idea, ya que veo mucho de este tipo de código en muchos de los node_modules que uso:

var development = process.env.NODE_ENV !== 'production';

Tenga en cuenta que se trata de una muy mala idea para tratar de conjunto NODE_ENVdesde dentro de una aplicación propio nodo - si lo hace será sólo se aplican al proceso de la cual se establece , por lo que probablemente las cosas no funcionarán como que esperar que. No lo hagas, te arrepentirás.

Ed Hinchliffe
fuente
55
En Express 4, app.configure()se ha eliminado. La guía de migración Express 4 recomienda "usar process.env.NODE_ENVo app.get('env')detectar el entorno y configurar la aplicación en consecuencia".
Chris Bartley
3
Creo que es mejor usar app.get ('env') porque si el entorno es un nodo indefinido, el valor predeterminado es dev, ya que solo al verificar la variable usted mismo se obtiene indefinido
light24bulbs
11
Buen punto: agregué una nota para resaltar el valor predeterminado. Sin embargo, mi sensación personal es que no debes usar app.get('env')precisamente por esa razón. Oculta que esta variable importante no está configurada, lo que hace que las cosas parezcan inconsistentes cuando se accede desde fuera de express. Además creo que es menos dañino para tener el código de depuración accidentalmente no se está ejecutando en un entorno de desarrollo de lo que es tener que accidentalmente se ejecuta en un entorno de producción.
Ed Hinchliffe
55
He medido los efectos de omitir la configuración NODE_ENV en aplicaciones express. El valor predeterminado es developmentque, entre otras cosas, significa que las plantillas se volverán a procesar para cada solicitud. La consecuencia es una ganancia o pérdida de rendimiento de ~ 75% entre la producción y el desarrollo al usar Jade. También he creado una publicación de blog sobre ese apmblog.dynatrace.com/2015/07/22/…
DanielKhan
8
Creo que para proyectos express, además de "producción" y "desarrollo", al menos necesita otra "prueba" para ejecutar las pruebas automatizadas. Es posible que desee utilizar una base de datos diferente para los datos de prueba poblados.
amanecer
19

NODE_ENV es una variable de entorno que significa entorno de nodo en el servidor express.

Es cómo configuramos y detectamos en qué entorno estamos.

Es muy común usar productiony development.

Conjunto:

export NODE_ENV=production

Obtener:

Puedes conseguirlo usando app.get('env')

Alireza
fuente
11

Supongo que la pregunta original incluía cómo Express usa esta variable de entorno.

Express usa NODE_ENV para alterar su propio comportamiento predeterminado. Por ejemplo, en el modo de desarrollo, el controlador de error predeterminado enviará un seguimiento de pila al navegador. En el modo de producción, la respuesta es simple Internal Server Error, para evitar filtrar detalles de implementación al mundo.

Randy Hudson
fuente
0

Por lo general, usaría la NODE_ENVvariable para tomar acciones especiales cuando desarrolle, pruebe y depure su código. Por ejemplo, para producir registros detallados y resultados de depuración que no desea en producción. Express se comporta de manera diferente dependiendo de si NODE_ENVestá configurado como productiono no. Puede ver esto si coloca estas líneas en una aplicación Express y luego realiza una solicitud HTTP GET para /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Tenga en cuenta que este último app.use()debe ser el último, después de todos los demás manejadores de métodos.

Si se establece NODE_ENVque productionantes de empezar su servidor y, a continuación, envía una GET /errorsolicitud a la misma, no se debe ver el texto Forcing an error!en la consola, y la respuesta no debe contener un seguimiento de la pila en el cuerpo HTML (que a partir de orígenes Express). Si, en cambio, establece NODE_ENValgo más antes de iniciar su servidor, debería ocurrir lo contrario.

En Linux, configure la variable de entorno NODE_ENV de esta manera:

export NODE_ENV = ' valor '

Rienda
fuente