nodejs的呈现为前端行业带来了有限的可能性,让很多原来只负责客户端开发的同学也缓缓开始接触和应用服务器端技术.
尽管nodejs带来了很多的益处,然而它也存在本身的局限性.和那些传统老牌的编程语言相比,如JAVA,PHP.nodejs并不能成为它们的替代品,而且在可预估的将来,也很难撼动那些老牌编程语言的位置.
目前nodejs次要有以下几个利用场景.
前端工程化,比方rollup,webpack在工程化方向的摸索nodejs中间层客户端集成nodejs,比方electron市面上一些不太简单的利用抉择nodejs作为后端编程语言本文次要讲一讲nodejs作为中间层的一些实际,查看下图.
传统的的开发模式由浏览器间接和Server层间接通信,中间层的退出意味着在浏览器和Server层之间额定增加了一层.
原来客户端间接向Server发送申请,Server层收到申请后通过计算解决将后果返回给浏览器.
现在浏览器将申请发送给node层,node层通过一轮解决后再向Server层发动申请.Server层处理完毕将响应后果返回给node层,node层最初将数据返回给浏览器.
因为node层的呈现,Server层能够只用关注业务自身,而不用理睬前端对字段的特殊要求。
node层能够向server层获取数据,再通过对数据的计算整合转换成合乎前端UI要求的数据格式.另外整个利用如果采纳微服务架构,那么Server层会有很多台治理独自业务模块的服务器,node层就很好的适配了微服务的架构,它能够向多台服务器发动申请获取到不同模块的数据再整合转化发送给前端.
上面着重介绍一下nodejs作为中间层的局部实际.
代理转发代理转发在理论中有很多宽泛的利用.浏览器首先将申请发送给node服务器,申请收到后node服务器能够对申请做一些解决,比方将原来的门路变换一下,申请头的信息扭转一下,再把批改后的申请发送给近程实在的服务器.
近程服务器计算出响应后果再返回给node服务器,node服务器依然能够对响应做选择性解决再分返回给浏览器.
代理转发能够解决前端日常开发中常常遇到的跨域问题,另外它还屏蔽了近程实在服务器的细节,让浏览器只与node服务器通信.上面是简略的实际.
const express = require('express');const { createProxyMiddleware } = require('http-proxy-middleware');const app = express();//创立利用app.use("/api",createProxyMiddleware( //设置代理转发 { target: 'http://www.xxx.com', //举例轻易写的地址 changeOrigin: true, pathRewrite: function (path) { return path.replace('/api', '/server/api'); } }));app.use("*",(req,res)=>{ //不是以'/api'结尾的路由全副返回"hello world" res.send("hello world");})app.listen(3000);http-proxy-middleware是一个第三方依赖包,能够十分不便设置代理转发,须要通过npm装置. 如果以后拜访的门路是以/api结尾,那么该申请就会被http-proxy-middleware拦挡.察看http-proxy-middleware外面配置的参数.
target代表近程实在服务器的地址.changeOrigin设置为true,示意将申请转发到target地址上.pathRewrite是对申请门路做一下解决,将/api转换成/server/api.下面的案例意思很显著,如果以后浏览器拜访http://localhost:3000/api/list.因为这个门路以/api结尾所以会被拦挡,从而触发pathRewrite函数批改拜访门路.最终拜访门路就变成了http://www.xxx.com/server/api/list,而后就会向这个门路发动申请,失去响应后再返回给浏览器,
接口聚合下面介绍的接口转发在实践中很少会独自利用,如果仅仅只是为了转发一下数据,那还不如间接用nginx配置一下,转发就搞定了.
如果接口聚合和接口转发都须要,那么从代码层面去解决还是优先思考的形式.
接口聚合是什么意思呢?假如当初企业有两个销售体系,一个是线上的电商平台销售,另一个是线下实体店.它们别离属于不同的团队经营,保护着不同的数据系统.
如果以后申请只是想查问一下电商平台某款商品的信息,只须要将接口转发给电商平台零碎即可.同理如果仅仅只是查问线下实体店某一天的销售业绩,能够间接把申请转发给线下数据系统查问,再把响应数据返回.下面介绍的插件http-proxy-middleware反对配置多个代理门路,具体可查问文档.
当初有这么一个需要,指标是查问本周某款商品在线上和线下销售数据的比照.那么这个时候就须要node层向两个近程服务器发送申请别离获取线上销售数据和线下销售数据,将这两局部数据聚合解决后再返回给前端.简略实际如下.
const express = require('express');const { createProxyMiddleware } = require('http-proxy-middleware');const app = express();//创立利用//伪代码app.get("/getSaleInfo",async (req,res)=>{ const online_data = await getOnline(); //获取线上数据 const offline_data = await getOffline(); //获取线下数据 res.send(dataHanlder(online_data,offline_data)); //对数据处理后返回给前端})proxyHanlder(app);//伪代码,将代理转发的逻辑封装起来app.use("*",(req,res)=>{ res.send("hello world");})app.listen(3000);/getSaleInfo代表着将两条数据聚合的自定义路由,如果须要聚合数据的需要比拟多,这块逻辑要独自封装到路由模块中治理,并且要写在代理转发的后面.
...