我正在构建我的第一个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
开始,但稍后无法使用。
有关如何加载密钥不可用的文件的一些信息:
.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的响应的异步(甚至不是我忽略的数据本身)正在产生问题。如何点击此外部端点,然后使用传入数据响应内部请求?
答案 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)
您似乎正试图以错误的方式从前端位置访问后端数据。 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一开始很混乱,但很快你就会克服这些小错误!