节点process.env变量为空

Sas*_*sha 2 javascript environment-variables node.js express reactjs

我正在构建我的第一个Express应用程序,它需要使用理想情况下仍然安全的API密钥与API进行交互.

所以我想遵循一个基本模式,即将密钥(以及任何未来的环境变量)保存在根目录的.gitignored .env文件中.

为了不重新发明轮子,我使用了这个包,并在我的app.coffee文件(应用程序的根文件)中设置我的env变量:

env = require('node-env-file')
env __dirname + '/.env'
console.log process.env.MY_API_KEY
Run Code Online (Sandbox Code Playgroud)

这会console.log打印出服务器日志的正确密钥.问题出现了:

如果我尝试在我的应用程序稍后加载的一个JS文件中访问该相同的变量,process.env则是一个空对象,因此API密钥是undefined.这不出现是与上述包装的一个问题,因为如果我在CL(定义变量API_KEY=whatever npm start),该行为是相同的-从正确的控制台日志中app.coffee,但不可用更高版本.

有关如何加载密钥不可用的文件的一些信息:

  • 该应用程序正在运行React,我写入了几个.jsx文件public/javascripts/src,并由gulpinto 编译public/javascripts/build/*.js.
  • 我试图访问一个关键.js文件public/javascripts/require通过的一个D .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' });
Run Code Online (Sandbox Code Playgroud)

但是这个(它使用一个单独的类来向外部API发出请求)会抛出一个错误:

router.get '/images', (req, res, next) ->
  new Images('nature').fetch (images) ->
    res.json({ some: 'json' })
Run Code Online (Sandbox Code Playgroud)

从本质上讲,它看起来像外部API的响应的异步(甚至不是数据本身,我忽略了),正在产生一个问题.如何点击此外部端点,然后使用传入数据响应内部请求?

Yur*_*bin 5

所有.jsx都是一些代码,重要的是代码执行的地方.process.env是一个可在Node.js运行时内访问的变量.当.jsx代码被转换为.js并提供给浏览器时,该process.env变量将不再存在.如果您在浏览器中进行API调用,则API密钥将从根本上提供给客户端.如果要保护密钥,则必须让Node.js服务器公开您的React应用程序将会遇到的API路由.然后,Node.js服务器将使用API​​密钥调用外部服务.因为该调用是由服务器进行的,所以process.env将可用,并将保持对客户端的隐藏.然后,您可以将API调用的结果转发回用户.


Joh*_*ink 5

后端 vs 前端

您似乎正在尝试以错误的方式从前端位置访问后端数据。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
...
Run Code Online (Sandbox Code Playgroud)

话虽如此,您希望将您的 API 密钥保密,如果您将其发送给位于该特定页面上的每个客户端,则不会发生这种情况。您应该做的是从后端进行调用xhr,例如使用模块,然后将数据传送到前端,无需 API 密钥。

我希望我说的很清楚,Node 一开始很混乱,但很快你就会克服这些小错误!