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:
.jsx
dans public/javascripts/src
, et qui sont compilés par gulp
dans public/javascripts/build/*.js
. .js
dans public/javascripts/
qui require
d par l'un des fichiers .jsx
. .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?
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.