process.env.NODE_ENV é indefinido

168

Estou tentando seguir um tutorial sobre NodeJs. Acho que não perdi nada, mas sempre que ligo, process.env.NODE_ENVo único valor que recebo é indefinido. De acordo com minha pesquisa, o valor padrão deve ser 'desenvolvimento'. Como esse valor é definido dinamicamente e onde é definido inicialmente?

basheps
fonte
para definir NODE_ENV para aplicativos heroku, você pode usar:heroku config:set NODE_ENV="production"
Connor Leech
14
Embora as respostas abaixo resolvam o problema temporariamente, definindo a variável de ambiente, a lição mais importante aqui é que você nunca sabe se alguma variável de ambiente será definida ... Portanto, escreva seu código adequadamente e teste se está definido e, se for, para quê. Não faça suposições sobre isso.
Stijn de Witt

Respostas:

193

process.env é uma referência ao seu ambiente, então você deve definir a variável lá.

Para definir uma variável de ambiente no Windows :

SET NODE_ENV=development

no OS X ou Linux :

export NODE_ENV=development
James Tikalsky
fonte
4
você pode adicionar que, se NODE_ENV não estiver definido, o aplicativo se comportará como no modo "desenvolvimento"
Rocco
1
Para Linux, vi ~ / .bash_profile, depois insira NODE_ENV = development e salve.
Stonyau
6
Caso alguém mais lute ... existe uma diferença entre "SET V = VAL" e "SET V = VAL". Os espaços importam.
willem 14/03
4
Observe que o módulo "cross-env" é semelhante ao anterior e funcionará no OSX e no Windows: "cross-env NODE_ENV = development". Você precisa instalar o cross-env primeiro: "npm install cross-env --save". Tenha isso em um script no seu package.json e você poderá usar as duas plataformas.
Antonio Brandao
6
Não funcionou para mim. Eu executei export NODE_ENV=developmentno meu terminal Mac antes de fazer um a react-native run-iospartir do mesmo terminal. Ao depurar, o valor de process.env.NODE_ENVé indefinido.
Ash
58

dicas

em package.json:

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

em app.js:

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

então, isso pode ser melhor:

"start": "set NODE_ENV=dev&& node app.js"

ou

console.log(process.env.NODE_ENV.trim() === 'dev') // true
Kenberkeley
fonte
2
O que você pode fazer é isso, para que você não precise cortar:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah
Excelente observação, console.log(process.env.NODE_ENV.length) // 4 (incluindo um espaço no final)
gregn3
1
Isso é mais seguro:, console.log(('' + process.env.NODE_ENV).trim() === 'dev') // truepois não gerará um erro, mesmo que process.env.NODE_ENV seja indefinido.
gregn3
52

Para pessoas que usam * nix (Linux, OS X, etc.), não há razão para fazê-lo por meio de um segundo comando de exportação; você pode encadeá-lo como parte do comando de chamada:

NODE_ENV=development node server.js

Mais fácil, não? :)

mlaccetti
fonte
3
Um pacote como o cross-env também permitirá que funcione no Windows.
walkerrandophsmith
35

Encontramos este problema ao trabalhar com o nó no Windows.

Em vez de exigir que qualquer pessoa que tente executar o aplicativo defina essas variáveis, fornecemos um fallback no aplicativo.

var environment = process.env.NODE_ENV || 'development';

Em um ambiente de produção, nós o definiríamos pelos métodos usuais (SET / export).

Jacob
fonte
3
Esta é a solução mais pragmática.
Druskacik 14/09/19
12

Você pode usar o pacote npm cross-env . Ele cuidará do corte da variável de ambiente e também garantirá que ele funcione em diferentes plataformas.

Na raiz do projeto, execute:

npm install cross-env

Em seguida, em seu package.json, em scripts, adicione:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

Em seu terminal, na raiz do projeto, inicie o aplicativo executando:

npm start

A variável de ambiente estará disponível no seu aplicativo como process.env.NODE_ENV, para que você possa fazer algo como:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}
Liran H
fonte
Eu não acho que isso funciona. Tentei no meu projeto atual e NODE_ENV ainda está indefinido. Isso pode precisar de mais configurações para funcionar ao que parece.
Aakash Thakur
1
Pesquisei cerca de duas horas para encontrar esta resposta, obrigado!
Bob
npm install --save-dev cross-env
DalSoft
9

No package.json, temos que configurar como abaixo (funciona no Linux e Mac OS)

o importante é "export NODE_ENV = production", após os comandos de construção abaixo serem um exemplo:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • para o ambiente de desenvolvimento, temos que pressionar o comando "npm run dev"

  • para um ambiente de produção, precisamos pressionar o comando "npm run start"

DV Yogesh
fonte
9

No macOS para aqueles que estão usando a versão expressa 4.x.xe o DOTENVplug - in, é necessário usar o seguinte:

  1. Após instalar o plug-in, importe como o seguinte no arquivo em que você iniciou o aplicativo: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. No diretório raiz, crie um arquivo '.env' e adicione o variável como:

    NODE_ENV=development ou NODE_ENV = development

NRP
fonte
6

No UBUNTU, use:

$ export NODE_ENV = teste

Gilbert Flamino
fonte
1

É devido ao SO

No seu package.json, certifique-se de ter seus scripts (Onde app.js é o seu arquivo js principal a ser executado e NODE_ENV é declarado em um arquivo .env).

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

Para Windows

Configure também sua variável de arquivo .env com NODE_ENV = development

Se o seu arquivo .env estiver em uma pasta da pasta eg.config, especifique no app.js (seu arquivo js principal)

const dotenv = require ('dotenv'); dotenv.config ({caminho: './config/config.env'});

Adrian Almeida
fonte
0

Se você enfrentou esse problema no React, precisará de [email protected] e superior. Também para outras variáveis ​​de ambiente que NODE_ENVnão sejam para trabalhar no React, elas precisam ser prefixadas REACT_APP_.

Daniel
fonte
0

O mais cedo possível no seu aplicativo, exija e configure o dotenv.

require('dotenv').config()

Khushwant kodecha
fonte
-3

Você também pode configurá-lo por código, por exemplo:

process.env.NODE_ENV = 'test';

joaquindev
fonte
67
Eu desencorajo fortemente qualquer pessoa a mudar o identificador de ambiente na lógica do aplicativo. Você nunca deseja que o aplicativo pense de repente que é outra coisa do que realmente é. Isso só deve ser alterado no nível do sistema, como muitas das outras respostas sugerem.
Kafoso 7/07
7
Você pode ler cerca de 12 aplicativos de fator: 12factor.net/config . Este código seria uma violação disso. Existem boas razões para manter sua configuração separada do seu código.
jcollum
1
Pode ser útil apenas para testes automatizados, mas mesmo assim pode ser abstraído e injetado no código principal, em vez de ser lido diretamente do env.
Angelos Pikoulas
Não reduzimos tanto a resposta dessa resposta que o comentário informativo de @Kafoso diminui. Ou adicione essas informações a alguma resposta bem votada.
Vibhor Dube 17/06