我正在构建我的第一个 Express 应用程序,它需要使用理想情况下保持安全的 API 密钥与 API 进行交互。
所以我想遵循一个基本模式,将密钥(以及任何未来的环境变量)保存在一个.gitignore
d .env
根目录下的文件。
为了不重新发明轮子,我用了这个包 https://www.npmjs.com/package/node-env-file,并像这样设置我的环境变量,在我的app.coffee
文件(应用程序的根文件):
env = require('node-env-file')
env __dirname + '/.env'
console.log process.env.MY_API_KEY
That console.log
将正确的密钥打印到服务器日志中。后来问题就出现了:
如果我尝试访问我的应用程序稍后加载的 JS 文件之一中的同一变量,process.env
是一个空对象,所以API密钥是undefined
。这不appear上面的包有问题,因为如果我在 CL 中定义变量(API_KEY=whatever npm start
),行为是相同的 - 它控制台正确记录app.coffee
但以后就无法使用了。
有关如何加载密钥不可用的文件的一些信息:
- 该应用程序正在运行 React,我写给一些人
.jsx
文件在public/javascripts/src
,并且由以下人员编译gulp
into public/javascripts/build/*.js
.
- 我正在尝试访问 a 中的密钥
.js
文件输入public/javascripts/
这是require
d 由其中之一.jsx
files.
- 在那个需要的
.js
file, process.env
返回一个空对象。当我尝试访问时process.env
in the .jsx
文件,我实际上被告知process
本身是未定义的。
有什么想法吗?我是 Express/React 新手,不清楚这在哪里process
对象,我认为它是全局的并定义在npm start
已定义,并且所有发生的事情env
里面的信息。
谢谢!如果有任何其他信息有帮助,或者有人对如何更好地处理私人信息有任何建议,请告诉我env
我的情况的信息。
EDIT:
我尝试了下面的建议,并在内部创建了一个单独的端点,它访问外部 API,然后返回响应。我已经正确地将事情串起来,以便正确响应:
router.get '/images', (req, res, next) ->
res.json({ some: 'json' });
but this(它使用单独的类向外部 API 发出请求),抛出错误:
router.get '/images', (req, res, next) ->
new Images('nature').fetch (images) ->
res.json({ some: 'json' })
从本质上讲,外部 API 响应的异步性(甚至是我忽略的数据本身)似乎造成了问题。如何访问此外部端点,然后使用传入数据响应内部请求?