1
votes

Les variables d'environnement ne se chargent pas dans process.env dans Nodejs

Je suis en train de créer une API nodejs et j'ai configuré le package dotenv en tant que dépendance de développement pour charger les variables dans process.env sur les machines locales du développeur.

Notez que lorsque je me connecte, j'utilise sudo -i pour fonctionner comme root.

Mon intention est que lors du déploiement, des variables d'environnement soient définies dans mon hôte Ubuntu sous / etc / environment , chargé directement dans le processus, puis l'application s'exécuterait simplement pour cette configuration.

Pour ce faire, j'ai une ligne au début de server.js:

logger.info({
    connectionConfig: {
        host: process.env.APP_DATABASE_HOST
        , login: process.env.APP_DATABASE_LOGIN
        , port: process.env.APP_DATABASE_PORT
        , databaseName: process.env.APP_DATABASE_NAME
    }
});

Et les développeurs seront invités à ajouter une variable d'environnement à leur système pour NODE_ENV code>.

Maintenant, dans mon instance Ubuntu EC2, j'ai configuré le / etc / environment pour avoir les variables d'environnement que je veux (notez que NODE_ENV étant 'dev' ici est juste pour éviter d'exécuter dotenv):

PORT=MYPORT
NODE_ENV=dev
APP_SECRET_KEY='MYSECRET'
APP_DATABASE_LOGIN=MYLOGIN
APP_DATABASE_PASSWORD='MYPASS'
APP_DATABASE_HOST=MYHOST
APP_DATABASE_NAME=MYDB
APP_DATABASE_PORT=MYDBPORT

Et quand je redémarre et lance printenv , ils sont tous remplis par le fichier.

Je ha J'ai configuré pm2 pour exécuter mon application directement à partir de server.js sans aucune configuration supplémentaire car si je comprends bien, process.env est renseigné automatiquement à partir de variables d'environnement.

Cependant, lorsque je consigne les valeurs de process.env, j'obtiens simplement null pour tout:

if(process.env.NODE_ENV === 'development') {
    logger.info("Loading dotenv for development environment")
    require('dotenv').config();
}

Y a-t-il un problème avec le configuration telle quelle ici?

Remarque: selon la réponse ci-dessous, j'avais configuré par erreur mes variables d'environnement APRÈS avoir démarré pm2, et en tant que tel, la mise en cache pm2 les manquait


2 commentaires

que se passe-t-il si vous l'exécutez sans pm2 ?


@MarcosCasagrande Lorsque j'exécute npm start directement, il charge correctement les variables d'environnement mais comme PM2 est en cours d'exécution et utilise déjà le port, il échoue


3 Réponses :


4
votes

Le problème est que pm2 met en cache les variables d'environnement.

Vous devez faire:

pm2 reload ecosystem.json --update-env

Si, pour une raison quelconque, cela ne fonctionne pas. t travail, la manière documentée est:

# all apps
pm2 restart all --update-env
# specific app
pm2 restart {pid} --update-env

Vous pouvez en savoir plus sur ici :


3 commentaires

Salut Marcos - merci pour cela. Votre question initiale m'a incité à enquêter et je suis arrivé à la même conclusion. Cependant, le correctif pour moi était d'exécuter pm2 restart --update-env all . Pouvez-vous mettre cela en première ligne de votre réponse pour que je puisse accepter?


Ajout de cette ligne aussi.


J'avais configuré par erreur mes variables d'environnement APRÈS avoir démarré pm2 plus tôt dans le processus et je ne connaissais pas la mise en cache - merci encore!



3
votes

J'ai traversé le même problème, c'est à cause du terminal intégré dans Visual Studio et du code Visual Studio, il semble qu'ils n'ont accès à aucune de ces variables à moins que vous n'exécutiez l'éditeur en mode Admin. ce problème, il vous suffit de démarrer votre éditeur en mode Amin


0 commentaires

0
votes

Assurez-vous d'avoir ce code dans le fichier app.js

> const path = require('path');  require('dotenv').config({ path:
> path.join(__dirname, '.env') });


0 commentaires