O que é o NODE_ENV e como usá-lo no Express?

184

Este é o meu aplicativo, atualmente estou em execução na produção.

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

No entanto, eu vim a conhecer NODE_ENVe quero usá-lo. Como posso fazer isso?

TIMEX
fonte
No seu caso, suponho que você possa usar app.configure('development', ...)ou "produção" para definir determinadas configurações apenas para ambientes de desenvolvimento ou produção. Veja expressjs.com/api.html#app.configure
Andreas Hultgren,

Respostas:

360

NODE_ENVé uma variável de ambiente popularizada pela estrutura expressa do servidor da web. Quando um aplicativo de nó é executado, ele pode verificar o valor da variável de ambiente e fazer coisas diferentes com base no valor. NODE_ENVespecificamente é usado (por convenção) para indicar se um ambiente específico é um ambiente de produção ou desenvolvimento . Um caso de uso comum está executando código de depuração ou log adicional se estiver sendo executado em um ambiente de desenvolvimento.

Acessando NODE_ENV

Você pode usar o código a seguir para acessar a variável de ambiente você mesmo, para poder executar suas próprias verificações e lógica:

var environment = process.env.NODE_ENV

Ou, alternativamente, usando express ' app.get('env')( nota: esse padrão é "development")

Esteja ciente de que, se você não tiver definido explicitamente NODE_ENVpara o seu ambiente, será undefined.

Definindo NODE_ENV

Como realmente definir a variável de ambiente varia de sistema operacional para sistema operacional e também depende da configuração do usuário.

Se você deseja definir a variável de ambiente como única, é possível fazer isso na linha de comando:

  • linux e mac :export NODE_ENV=production
  • janelas :$env:NODE_ENV = 'production'

A longo prazo, você deve persistir com isso para não desarmar se você reiniciar - em vez de listar todos os métodos possíveis para fazer isso, vou deixar você pesquisar como fazer isso sozinho!

A Convenção determinou que existem apenas dois valores que você deve usar para NODE_ENV, productionou para development, todos em minúsculas. Não há nada que o impeça de adicionar mais valores, mas provavelmente não é uma boa ideia, pois vejo muito desse tipo de código em muitos dos node_modules que eu uso:

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

Note-se que é uma péssima idéia para tentar conjunto NODE_ENVde dentro de si uma aplicação nó - se você fizer isso vai só se aplicam ao processo a partir do qual ele foi criado , então as coisas provavelmente não vai funcionar como você espera que eles. Não faça isso - você vai se arrepender.

Ed Hinchliffe
fonte
5
No Express 4, app.configure()foi removido. O guia de migração do Express 4 recomenda "usar process.env.NODE_ENVou app.get('env')detectar o ambiente e configurar o aplicativo de acordo".
Chris Bartley
3
Eu acho que é melhor usar app.get ( 'env'), porque se o ambiente é defaults nó indefinidos para dev onde, como apenas verificando a variável se dá indefinido
light24bulbs
11
Bom ponto - adicionei uma nota para destacar o padrão. No entanto, meu sentimento pessoal é que você não deve usar app.get('env')exatamente por esse motivo. Ele cobre que essa variável importante não está definida - fazendo com que as coisas pareçam inconsistentes quando você a acessa de fora do express. Além disso, eu acho que é menos prejudicial para ter código de depuração acidentalmente não correr em um ambiente de desenvolvimento do que é tê-lo acidentalmente em execução em um ambiente de produção.
precisa
5
Eu medi os efeitos de omitir a configuração NODE_ENV em aplicativos expressos. O padrão é o developmentque - entre outras coisas - significa que os modelos serão reprocessados ​​para cada solicitação. A conseqüência é um ganho ou dreno de desempenho de ~ 75% entre produção e desenvolvimento ao usar o Jade. Eu também criei uma postagem no blog em que apmblog.dynatrace.com/2015/07/22/…
DanielKhan
8
Eu acho que para projetos expressos, além de "produção" e "desenvolvimento", você precisa de pelo menos outro "teste" para executar os testes automatizados. Você pode querer usar um banco de dados diferente para dados de teste preenchidos.
Dawnstar 2/16
19

NODE_ENV é uma variável ambiental que representa o ambiente do nó no servidor expresso.

É como definimos e detectamos em que ambiente estamos.

É muito comum usar productione development.

Conjunto:

export NODE_ENV=production

Obter:

Você pode obtê-lo usando app.get('env')

Alireza
fonte
11

Suponho que a pergunta original incluísse como o Express usa essa variável de ambiente.

Express usa NODE_ENV para alterar seu próprio comportamento padrão. Por exemplo, no modo de desenvolvimento, o manipulador de erros padrão retornará um rastreamento de pilha ao navegador. No modo de produção, a resposta é simples Internal Server Error, para evitar vazar detalhes da implementação para o mundo.

Randy Hudson
fonte
0

Normalmente, você usaria a NODE_ENVvariável para executar ações especiais ao desenvolver, testar e depurar seu código. Por exemplo, para produzir resultados detalhados de log e depuração que você não deseja na produção. O próprio Express se comporta de maneira diferente, dependendo de NODE_ENVestar definido como productionou não. Você pode ver isso se colocar essas linhas em um aplicativo Express e fazer uma solicitação 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!")
})

Observe que o último app.use()deve ser o último, depois de todos os outros manipuladores de métodos!

Se você definir NODE_ENVa productionantes de iniciar seu servidor e, em seguida, enviar um GET /errorpedido para ele, você não deve ver o texto Forcing an error!no console, ea resposta não deve conter um rastreamento de pilha no corpo HTML (que origens da Express). Se, em vez disso, você definir NODE_ENVoutra coisa antes de iniciar o servidor, o contrário deverá acontecer.

No Linux, defina a variável de ambiente NODE_ENV assim:

exportar NODE_ENV = ' valor '

Rédea
fonte