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
3 Réponses :
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 :
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!
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
Assurez-vous d'avoir ce code dans le fichier app.js
> const path = require('path'); require('dotenv').config({ path: > path.join(__dirname, '.env') });
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