【问题标题】:Node process.env variables empty节点 process.env 变量为空
【发布时间】: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


【解决方案1】:

后端与前端

您似乎正试图以错误的方式从前端位置访问后端数据。 Node.js 的强大之处在于前端和后端都有 JavaScript,但一开始很难理解每个脚本在哪一侧执行。

在 Express 项目中,所有发送到前端的 Javascript 文件,将直接与客户端页面交互的文件,都位于public/javascripts/。通常,您在其中一些文件中会有一些 AJAX 函数来交换数据并与后端通信。

这些后端文件位于其他任何地方:在根目录、routes/ 以及您创建的所有其他文件夹中。这些文件几乎都连接到您的 Node 实例,因此可以使用诸如 process 之类的全局对象相互通信。

您在客户端计算机上执行的public/javascripts/ 中的脚本正试图直接访问位于运行您的节点实例的服务器上的变量:这就是您的代码不起作用的原因。如果您希望从后端访问数据,则必须在前端使用 AJAX 调用。

Server   <---(AJAX only)---   Client
------                        ------
app.js                        public/javascripts/script.js
routes.js
...

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

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

【讨论】:

  • 谢谢!欣赏解释。我尝试按照您上面的建议进行操作(内部端点访问外部 API 并使用数据进行响应),但遇到了另一个我不太了解的相关问题。以上更新。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2021-10-23
    • 2016-08-14
    • 2020-09-28
    • 1970-01-01
    • 2019-01-27
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多