Sas*_*sha 2 javascript environment-variables node.js express reactjs
我正在构建我的第一个Express应用程序,它需要使用理想情况下仍然安全的API密钥与API进行交互.
所以我想遵循一个基本模式,即将密钥(以及任何未来的环境变量)保存在根目录的.gitignore
d .env
文件中.
为了不重新发明轮子,我使用了这个包,并在我的app.coffee
文件(应用程序的根文件)中设置我的env变量:
env = require('node-env-file')
env __dirname + '/.env'
console.log process.env.MY_API_KEY
Run Code Online (Sandbox Code Playgroud)
这会console.log
打印出服务器日志的正确密钥.问题出现了:
如果我尝试在我的应用程序稍后加载的一个JS文件中访问该相同的变量,process.env
则是一个空对象,因此API密钥是undefined
.这不出现是与上述包装的一个问题,因为如果我在CL(定义变量API_KEY=whatever npm start
),该行为是相同的-从正确的控制台日志中app.coffee
,但不可用更高版本.
有关如何加载密钥不可用的文件的一些信息:
.jsx
文件public/javascripts/src
,并由gulp
into 编译public/javascripts/build/*.js
..js
文件public/javascripts/
被require
通过的一个D .jsx
文件..js
文件中,process.env
返回一个空对象.当我尝试访问process.env
的.jsx
文件,实际上,我告诉process
本身是不确定的.有什么想法在这里发生了什么?我是Express/React的新手,并且不清楚这个process
我认为全局和定义的对象在哪里npm start
被定义,以及env
它中的所有信息发生了什么.
谢谢!如果有任何其他信息有用,请告诉我,或者如果有人对如何更好地处理env
我的情况下的私人信息有任何建议.
编辑:
我尝试了下面的建议,并在内部创建了一个单独的端点,它点击外部API然后返回响应.我已经把事情做好了,所以这才能正确回应:
router.get '/images', (req, res, next) ->
res.json({ some: 'json' });
Run Code Online (Sandbox Code Playgroud)
但是这个(它使用一个单独的类来向外部API发出请求)会抛出一个错误:
router.get '/images', (req, res, next) ->
new Images('nature').fetch (images) ->
res.json({ some: 'json' })
Run Code Online (Sandbox Code Playgroud)
从本质上讲,它看起来像外部API的响应的异步(甚至不是数据本身,我忽略了),正在产生一个问题.如何点击此外部端点,然后使用传入数据响应内部请求?
所有.jsx都是一些代码,重要的是代码执行的地方.process.env
是一个可在Node.js运行时内访问的变量.当.jsx代码被转换为.js并提供给浏览器时,该process.env
变量将不再存在.如果您在浏览器中进行API调用,则API密钥将从根本上提供给客户端.如果要保护密钥,则必须让Node.js服务器公开您的React应用程序将会遇到的API路由.然后,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
...
Run Code Online (Sandbox Code Playgroud)
话虽如此,您希望将您的 API 密钥保密,如果您将其发送给位于该特定页面上的每个客户端,则不会发生这种情况。您应该做的是从后端进行调用xhr
,例如使用模块,然后将数据传送到前端,无需 API 密钥。
我希望我说的很清楚,Node 一开始很混乱,但很快你就会克服这些小错误!
归档时间: |
|
查看次数: |
3198 次 |
最近记录: |