Node process.env variables empty

Je crée ma première application Express, qui doit interagir avec une API, en utilisant une clé API qui, de façon idéale, reste sécurisée.

Je voulais donc suivre un schéma de base consistant à conserver la clé (et toutes les futures variables d'environnement), dans un fichier .gitignore d .env dans le répertoire racine.

Pour ne pas réinventer la roue, j'ai utilisé ce paquet et configuré mes variables env ainsi, dans mon fichier app.coffee (le fichier racine de l'application):

 env = require('node-env-file') env __dirname + '/.env' console.log process.env.MY_API_KEY 

Cette console.log imprime la bonne touche dans les journaux du serveur. Le problème se pose plus tard:

Si j'essaie d'accéder à cette même variable dans l'un des fichiers JS chargés plus tard par mon application, process.env est un objet vide, donc la clé API est undefined . Cela ne semble pas être un problème avec le package ci-dessus, car si je définis la variable dans la CL ( API_KEY=whatever npm start ), le comportement est le même: la console enregistre correctement depuis app.coffee mais n'est plus disponible .

Certaines informations sur la façon dont les fichiers dans lesquels la clé n'est pas disponible sont en cours de chargement:

  • L'application exécute React, que j'écris dans quelques fichiers .jsx dans public/javascripts/src , et qui sont compilés par gulp dans public/javascripts/build/*.js .
  • J'essaie d'accéder à la clé dans un fichier .js dans public/javascripts/ qui require d par l'un des fichiers .jsx .
  • Dans ce fichier .js requis, process.env renvoie un objet vide. Lorsque j'essaie d'accéder à process.env dans les fichiers .jsx , on me dit que le process lui-même est indéfini.

Des idées sur ce qui se passe ici? Je suis nouveau dans Express / React, et je ne sais pas où cet objet de process , que je pensais être global et défini sur npm start est défini, et ce qui se passe à toutes les informations env .

Merci! S'il vous plaît, faites-moi savoir si d'autres informations seraient utiles, ou si quelqu'un a des suggestions quant à la meilleure façon de gérer les informations env privées dans ma situation.

EDIT :

J'ai essayé les suggestions ci-dessous et j'ai créé un point final distinct en interne, qui frappe l'API externe puis renvoie une réponse. J'ai stricé les choses correctement, afin que cela réponde correctement:

 router.get '/images', (req, res, next) -> res.json({ some: 'json' }); 

Mais ceci (qui utilise une classe distincte pour faire une demande à une API externe), lance une erreur:

 router.get '/images', (req, res, next) -> new Images('nature').fetch (images) -> res.json({ some: 'json' }) 

Essentiellement, il semble que l'asynchronisation de la réponse de l'API externe (et même pas les données elles-mêmes, que j'ai ignorées), crée un problème. Comment puis-je toucher ce point final externe, puis répondre à la demande interne avec les données entrantes?

Back-end vs Front-end

Il semble que vous essayez d'accéder à des données de back-end à partir d'un emplacement frontal, de manière incorrecte. La grande puissance de Node.js a un JavaScript à l'avant et à l'arrière, mais il est tout à fait confus au début de comprendre de quel côté chaque script est exécuté.

Dans un projet Express, tous les fichiers Javascript qui sont envoyés vers l'avant, ceux qui interagissent directement avec la page du client, sont situés en public/javascripts/ . Généralement, vous aurez certaines fonctionnalités AJAX dans certains de ces fichiers pour échanger des données et communiquer avec le back-end.

Ces fichiers back-end sont situés partout ailleurs: dans le répertoire racine, dans les routes/ et tous les autres dossiers que vous créez. Ces fichiers sont à peu près tous connectés à votre instance de Nœud, et peuvent donc communiquer entre eux en utilisant des objets globaux comme des process par exemple.

Votre script en public/javascripts/ qui est exécuté sur l'ordinateur du client tente d'accéder directement à une variable située sur le serveur exécutant l'instance Node: c'est pourquoi votre code ne fonctionne pas. Si vous souhaitez accéder aux données à l'arrière-plan, vous devez utiliser les appels AJAX dans le front-end.

 Server <---(AJAX only)--- Client ------ ------ app.js public/javascripts/script.js routes.js ... 

Cela étant dit, vous vouliez garder votre clé API privée, ce qui ne se produira pas si vous l'envoyez à tous les clients qui se trouvent sur cette page spécifique. Ce que vous devez faire, c'est de faire l'appel à partir de l'arrière-plan, en utilisant le module xhr par exemple, puis de fournir les données à l'avant, sans la clé de l'API secrète.

J'espère que j'ai été clair, Node est assez déroutant au début, mais très bientôt, vous allez surmonter ces petites erreurs!

Tout .jsx est, est un code, ce qui compte, c'est l'endroit où le code est en cours d'exécution. process.env est une variable accessible à l'intérieur du temps d'exécution Node.js. Lorsque votre code .jsx est transféré vers .js et servi au navigateur, la variable process.env n'existera plus. Si vous effectuez un appel API dans le navigateur, la clé API sera fondamentalement disponible pour le client. Si vous souhaitez sécuriser la clé, vous devez faire en sorte que votre serveur Node.js expose une route API, que votre application React appuiera. Ce serveur Node.js effectuera alors l'appel au service externe à l'aide de la clé API. Étant donné que cet appel est effectué par le serveur, process.env sera disponible et restera caché au client. Vous pouvez ensuite renvoyer le résultat de l'appel API à l'utilisateur.