【发布时间】:2016-01-28 16:33:33
【问题描述】:
我正在构建我的第一个 Express 应用程序,它需要与 API 交互,使用的 API 密钥在理想情况下保持安全。
所以我想遵循一个基本模式,将密钥(以及任何未来的环境变量)保存在根目录的 .gitignored .env 文件中。
为了不重新发明轮子,我使用了this package,并在我的app.coffee 文件(应用程序的根文件)中设置了我的环境变量:
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) 中定义变量,行为是相同的——它从@987654331 正确记录控制台@ 但以后不可用。
有关如何加载密钥不可用的文件的一些信息:
- 应用程序正在运行 React,我将其写入
public/javascripts/src中的几个.jsx文件,并由gulp编译成public/javascripts/build/*.js。 - 我正在尝试通过
.jsx文件之一访问public/javascripts/中的.js文件中的密钥,该文件是required。 - 在所需的
.js文件中,process.env返回一个空对象。当我尝试访问.jsx文件中的process.env时,实际上我被告知process本身是未定义的。
有什么想法吗?我是 Express/React 的新手,不清楚这个 process 对象(我认为它是全局的并在 npm start 上定义)是在哪里定义的,以及其中的所有 env 信息发生了什么。
谢谢!请让我知道是否有任何其他信息会有所帮助,或者如果有人对在我的情况下如何更好地处理私人env 信息有任何建议。
编辑:
我尝试了以下建议,并在内部创建了一个单独的端点,该端点访问外部 API,然后返回响应。我已经正确地把事情串起来了,所以这会正确响应:
router.get '/images', (req, res, next) ->
res.json({ some: 'json' });
但是 this(它使用单独的类向外部 API 发出请求)会引发错误:
router.get '/images', (req, res, next) ->
new Images('nature').fetch (images) ->
res.json({ some: 'json' })
从本质上讲,外部 API 响应的异步性(甚至不是我忽略的数据本身)造成了问题。如何点击这个外部端点,然后用传入的数据响应内部请求?
【问题讨论】:
-
澄清一下,您需要在浏览器中提供并执行的文件中的 process.env?
-
嗯。我猜。这是否会使 API 密钥从根本上不安全?如果我想从 React 文件进行这个 API 调用,我该如何保护它?
-
@Sasha 您从编辑部分的代码中收到什么样的错误?
-
我实际上提出了一个单独的问题 (stackoverflow.com/questions/28468084/…)。我刚收到 500。在我的服务器日志或控制台日志中找不到比这更多的详细信息。 (我能够在节点中找到的错误报告或缺少报告完全是另一个问题)
标签: javascript node.js express reactjs environment-variables