我正在构建我的第一个 Express 应用程序,它需要使用一个理想情况下保持安全的 API key 与 API 交互。
所以我想遵循一种基本模式,将 key (以及任何 future 的环境变量)保存在根目录的 .gitignore
d .env
文件中。
为了不重新发明轮子,我使用了 this package ,并在我的 app.coffee
文件(应用程序的根文件)中像这样设置了我的环境变量:
env = require('node-env-file')
env __dirname + '/.env'
console.log process.env.MY_API_KEY
console.log
将正确的 key 打印到服务器日志中。后面出现问题:
如果我尝试在我的应用稍后加载的一个 JS 文件中访问同一个变量,则 process.env
是一个空对象,因此 API key 是 undefined
。这似乎不是上述包的问题,因为如果我在 CL (API_KEY=whatever npm start
) 中定义变量,行为是相同的——它控制台从 app.coffee
正确记录但不可用之后。
有关如何加载 key 不可用的文件的一些信息:
- 该应用程序正在运行 React,我将其写入
.jsx
中的几个public/javascripts/src
文件,并由gulp
编译为public/javascripts/build/*.js
。 - 我正在尝试通过
.js
文件之一访问public/javascripts/
中的require
文件中的 key ,即.jsx
d。 - 在所需的
.js
文件中,process.env
返回一个空对象。当我尝试访问process.env
文件中的.jsx
时,我实际上被告知process
本身是未定义的。
知道这里发生了什么吗?我是 Express/React 的新手,不清楚我认为是全局的并在 process
上定义的这个 npm start
对象在哪里定义,以及其中所有 env
信息发生了什么。
谢谢!请让我知道是否有任何其他信息有帮助,或者如果有人对如何更好地处理我的情况下的私有(private) 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 响应的异步性(甚至是我忽略的数据本身)似乎造成了问题。我如何访问此外部端点,然后使用传入数据响应内部请求?
最佳答案
后端与前端
您似乎正试图以错误的方式从前端位置访问后端数据。 Node.js 的强大之处在于前面和后面都有 JavaScript,但一开始很难理解每个脚本在哪一侧执行。
在 Express 项目中,所有发送到前端的 Javascript 文件,那些将直接与客户端页面交互的文件都位于 public/javascripts/
中。通常,您会在其中一些文件中使用一些 AJAX 函数来交换数据并与后端通信。
这些后端文件位于其他任何地方:在根目录中,在 routes/
中,以及您创建的所有其他文件夹中。这些文件几乎都连接到您的 Node 实例,因此可以使用诸如 process
之类的全局对象相互通信。
您在客户端计算机上执行的 public/javascripts/
中的脚本试图直接访问位于运行您的 Node 实例的服务器上的变量:这就是您的代码不起作用的原因.如果您希望从后端访问数据,则必须在前端使用 AJAX 调用。
Server <---(AJAX only)--- Client
------ ------
app.js public/javascripts/script.js
routes.js
...
话虽如此,您希望将您的 API key 保密,但如果您将它发送给该特定页面上的每个客户,就不会发生这种情况。你应该做的是从后端进行调用,例如使用 xhr
模块,然后将数据传递到前端,而不需要 secret API key 。
我希望我说清楚了,Node 一开始很令人困惑,但很快你就会克服这些小错误!
关于javascript - Node process.env 变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398903/