节点process.env变量为空

时间:2015-10-28 18:31:05

标签: javascript node.js express reactjs environment-variables

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

因此,我希望在根目录中的.gitignore d .env文件中遵循保持密钥(以及任何未来环境变量)的基本模式。

为了不重新发明轮子,我使用this package,并在我的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文件,并由gulp编译为public/javascripts/build/*.js
  • 我尝试访问.js public/javascripts/require文件中的密钥,该.jsx文件是.js个文件之一process.env
  • 在所需的process.env文件中,.jsx返回一个空对象。当我尝试访问process文件中的process时,我实际上已告知npm start本身未定义。

有什么想法在这里发生了什么?我是Express / React的新手,并且不清楚我认为env这个env对象在全球范围内定义的位置,以及router.get '/images', (req, res, next) -> res.json({ some: 'json' }); 定义的对象,以及所有router.get '/images', (req, res, next) -> new Images('nature').fetch (images) -> res.json({ some: 'json' }) 发生了什么1}}信息。

谢谢!如果有任何其他信息有用,请告诉我们,或者如果有人对我的情况下如何更好地处理私人var dup_array = original_array.slice 信息有任何建议。

修改

我尝试了下面的建议,并在内部创建了一个单独的端点,它点击外部API然后返回响应。我正确地把事情做好了,所以这才能正确回应:

current_user

this (使用单独的类向外部API发出请求),抛出错误:

<user "nickname">

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

后端vs前端

您似乎正试图以错误的方式从前端位置访问后端数据。 Node.js的强大功能是在前面和后面都有JavaScript,但是在开始时要理解每个脚本执行的哪一方是非常混乱的。

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

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

在客户端计算机上执行的public/javascripts/中的脚本正在尝试直接访问运行Node实例的服务器上的变量:这就是为什么您的代码没有#&# 39;工作。如果您希望从后端访问数据,则必须在前端使用AJAX调用。

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

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

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

相关问题