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