节点 process.env 变量为空
Node process.env variables empty
我正在构建我的第一个 Express 应用程序,它需要使用 API 密钥与 API 进行交互,该密钥最好保持安全。
所以我想遵循一种基本模式,将密钥(以及任何未来的环境变量)保存在根目录的 .gitignore
d .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
) 中定义变量,行为是相同的——它控制台从 app.coffee
正确记录,但以后不可用。
有关如何加载密钥不可用的文件的一些信息:
- 该应用程序是 运行 React,我将其写入
public/javascripts/src
中的几个 .jsx
文件,并由 gulp
编译为 public/javascripts/build/*.js
.
- 我正在尝试访问
public/javascripts/
中的 .js
文件中的密钥,该文件由 .jsx
文件之一 require
d 访问。
- 在那个需要的
.js
文件中,process.env
returns 一个空对象。当我尝试访问 .jsx
文件中的 process.env
时,我实际上被告知 process
本身是未定义的。
知道这里发生了什么吗?我是 Express/React 的新手,不清楚这个 process
对象在哪里定义,我认为它是全局的并且定义在 npm start
上,以及所有 env
信息发生了什么在里面。
谢谢!请让我知道是否有任何其他信息有帮助,或者如果有人对如何更好地处理私人 env
信息在我的情况下有任何建议。
编辑:
我尝试了下面的建议,并在内部创建了一个单独的端点,它命中外部 API 然后 returns 一个响应。我已经正确地串起来了,所以它能正确响应:
router.get '/images', (req, res, next) ->
res.json({ some: 'json' });
但是this(使用单独的class向外部API发出请求),抛出错误:
router.get '/images', (req, res, next) ->
new Images('nature').fetch (images) ->
res.json({ some: 'json' })
从本质上讲,外部 API 响应的异步性(甚至是我忽略的数据本身)似乎造成了问题。我如何点击这个外部端点,然后用传入的数据响应内部请求?
.jsx 只是一些代码,重要的是代码在哪里执行。 process.env
是一个可在 Node.js 运行时内访问的变量。当您的 .jsx 代码被转译为 .js 并提供给浏览器时,process.env
变量将不再存在。如果您在浏览器内进行 API 调用,则 API 密钥基本上可供客户端使用。如果你想保护密钥,你必须让你的 Node.js 服务器公开一个 API 路由,你的 React 应用程序将访问该路由。然后 Node.js 服务器将使用 API 键调用外部服务。因为该调用是由服务器进行的,所以 process.env
将可用,并且对客户端保持隐藏状态。然后您可以将 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 密钥保密,但如果您将其发送给该特定页面上的每个客户,就不会发生这种情况。你应该做的是从后端进行调用,例如使用 xhr
模块,然后将数据传递到前端,而不需要秘密 API 密钥。
我希望我说清楚了,Node 一开始很令人困惑,但很快你就会克服这些小错误!
我正在构建我的第一个 Express 应用程序,它需要使用 API 密钥与 API 进行交互,该密钥最好保持安全。
所以我想遵循一种基本模式,将密钥(以及任何未来的环境变量)保存在根目录的 .gitignore
d .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
) 中定义变量,行为是相同的——它控制台从 app.coffee
正确记录,但以后不可用。
有关如何加载密钥不可用的文件的一些信息:
- 该应用程序是 运行 React,我将其写入
public/javascripts/src
中的几个.jsx
文件,并由gulp
编译为public/javascripts/build/*.js
. - 我正在尝试访问
public/javascripts/
中的.js
文件中的密钥,该文件由.jsx
文件之一require
d 访问。 - 在那个需要的
.js
文件中,process.env
returns 一个空对象。当我尝试访问.jsx
文件中的process.env
时,我实际上被告知process
本身是未定义的。
知道这里发生了什么吗?我是 Express/React 的新手,不清楚这个 process
对象在哪里定义,我认为它是全局的并且定义在 npm start
上,以及所有 env
信息发生了什么在里面。
谢谢!请让我知道是否有任何其他信息有帮助,或者如果有人对如何更好地处理私人 env
信息在我的情况下有任何建议。
编辑:
我尝试了下面的建议,并在内部创建了一个单独的端点,它命中外部 API 然后 returns 一个响应。我已经正确地串起来了,所以它能正确响应:
router.get '/images', (req, res, next) ->
res.json({ some: 'json' });
但是this(使用单独的class向外部API发出请求),抛出错误:
router.get '/images', (req, res, next) ->
new Images('nature').fetch (images) ->
res.json({ some: 'json' })
从本质上讲,外部 API 响应的异步性(甚至是我忽略的数据本身)似乎造成了问题。我如何点击这个外部端点,然后用传入的数据响应内部请求?
.jsx 只是一些代码,重要的是代码在哪里执行。 process.env
是一个可在 Node.js 运行时内访问的变量。当您的 .jsx 代码被转译为 .js 并提供给浏览器时,process.env
变量将不再存在。如果您在浏览器内进行 API 调用,则 API 密钥基本上可供客户端使用。如果你想保护密钥,你必须让你的 Node.js 服务器公开一个 API 路由,你的 React 应用程序将访问该路由。然后 Node.js 服务器将使用 API 键调用外部服务。因为该调用是由服务器进行的,所以 process.env
将可用,并且对客户端保持隐藏状态。然后您可以将 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 密钥保密,但如果您将其发送给该特定页面上的每个客户,就不会发生这种情况。你应该做的是从后端进行调用,例如使用 xhr
模块,然后将数据传递到前端,而不需要秘密 API 密钥。
我希望我说清楚了,Node 一开始很令人困惑,但很快你就会克服这些小错误!