javascript - Node process.env 变量为空

标签 javascript node.js express reactjs environment-variables

我正在构建我的第一个 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/

相关文章:

javascript - 在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成

javascript - 检测原始数据的变化

javascript - 移动网络应用程序可以在后台运行吗? (iOS & 安卓)

javascript - 在 jQuery 中使用整数字符串类型对数组进行排序

javascript - 线接触或矩形或圆形

javascript - 在node.js上显示html

javascript - 如何查询每天特定时间创建的所有文档?

Javascript二次排序

javascript - .val() 四舍五入?

node.js - 我如何用 TypeScript ES6 样式 'EventEmitter = require(' events').EventEmitter' 重写此语句?