节点 process.env 变量为空

IT技术 javascript node.js express reactjs environment-variables
2021-05-25 00:50:32

我正在构建我的第一个 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,并且被编译gulppublic/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 的响应的异步性(甚至不是我忽略的数据本身)正在产生问题。我如何点击这个外部端点,然后用传入的数据响应内部请求?

2个回答

后端 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
...

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

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

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