NodeJS作为中间服务器实现前后端分离Node天然适合处理业务级逻辑,但不适合数据计算处理。在做web项目时,使用node作为中间服务器处理客户端的页面渲染,将请求转发给接口服务器,实现前后端分离。后端不再需要管理前端的业务渲染,专注于接口的抽象性和灵活性。前端不再需要等待路由页面添加完成再写入页面,可以自行将需要的页面添加到路由中。共管中间服务器的功能很简单,前后端可以共同管理。前端负责添加页面级路由,后端负责将路由转发给接口服务器。分层和节点的职责。简单解释一下:最顶端就是server端,也就是我们常说的后端。对于我们来说,后端就是接口的集合,服务端提供了各种接口供我们使用。因为有Node层,所以不需要限制服务的形式。对于后端开发,他们只使用关心业务代码的接口。服务器下方是Node应用程序。Node应用中有一层ModelProxy来与服务器进行通信。这一层主要是为了打通我们调用不同接口的方式,封装视图层需要的一些Model。Node层也可以轻松实现原有的vmcommon、tms(指淘宝内容管理系统)等需求。由开发人员决定为Node层使用什么框架。不过推荐使用express+xTemplate的组合,前后端可以共享xTemplate。Node怎么用就看大家了,但令人兴奋的是,我们终于可以用Node轻松实现我们想要的输出方式:JSON/JSONP/RESTful/HTML/BigPipe/Comet/Socket/synchronous,asynchronous,随心所欲如何修复它完全取决于您的场景。浏览器层在我们的架构中并没有发生变化,我们也不想因为Node.js的引入而改变大家之前对在浏览器中开发的认识。Node的引入,只是把应该由前端控制的部分交给了前端。node+express搭建中间服务器server.jsvarexpress=require('express')varrMiddle=require('./router/rMiddle.js')//转发remoteapi到接口服务器app.use('/remoteapi',rMiddle);//前端页面渲染app.get('/index',function(req,res){res.sendFile(__dirname+'index.html');})app.listen('8080',function(err){if(err){return;}console.log('Listeningatlocalhost:8080');});/router/rMiddle.jsvarexpress=require('express');varhttp=require('http');varquerystring=require('querystring');varrouter=express.Router();//你的接口服务器地址varconnectServer={port:'9000',protocol:'http://',host:'192.168.0.1'};varserverDomainPort=connectServer.port;varserverDomainProtocol=connectServer.protocol;varserverDomainHost=connectServer.hostvarserverDomain=serverDomainProtocol+serverDomainHost+':'+serverDomainPort;//定义一个通用的Get传输所有数据的接口,不再写router.get('*',(req,res)=>{letreqUrl=serverDomain+req.url;console.log('[GET请求]:',reqUrl);http.get(reqUrl,(sres)=>{varstatusCode=sres.statusCode;varcontentType=sres.headers['content-type'];leterror;if(statusCode!==200){error=newError(`请求失败。\n`+`状态代码:${statusCode}`);}elseif(!/^application\/json/.test(contentType)){error=newError(`无效的内容类型。\n`+`Expectedapplication/jsonbutreceived${contentType}`);}if(error){//消耗响应数据以释放内存sres.resume();res.status(500).end();return;}sres.setEncoding('utf8');letrawData='';sres.on('data',(chunk)=>rawData+=chunk);sres.on('end',()=>{尝试{letparsedData=JSON.parse(rawData);res.json(parsedData);}catch(e){res.status(500).send(e.message);}});}).on('error',(e)=>{console.log(`Goterror:${e.message}`);res.status(500).end();});})//定义一个通用的Post接口来传输所有数据router.post('*',(req,res)=>{varreqUrl=serverDomain+req.url;varreqContentType=req.headers['content-type'];varreqBody=req.body;//根据请求的content-type决定使用哪种格式varreqData=reqContentType.indexOf('json')!==-1?JSON.stringify(reqBody):querystring.stringify(reqBody);varpostOpt={host:serverDomainHost,port:serverDomainPort,path:req.url,method:'POST',headers:{'Content-Type':reqContentType}};varsreq=http.request(postOpt,(sres)=>{varbody='';varerror;if(sres.statusCode!==200){error=newError(`RequestFailed.\n`+`StatusCode:${sres.statusCode}`)}if(error){console.log(error.message);sres.resume();res.status(500).end();返回;}sres.on('data',(data)=>{body+=data;}).on('end',()=>{try{varparsedData=JSON.parse(body);res.json(parsedData);}catch(e){console.log(e.message);res.status(500).send(e.message);}}).on('error',()=>{console.log('[ERROR]whenrequrl:',reqUrl,reqData);res.status(500).send('error');})})sreq.write(reqData);sreq.end();})module.exports=router;透传还是不透传中间服务器在转发请求的时候,如果只是简单的请求数据,那么透传是一个很好的方法,但是如果想做进一步的优化,可能需要中间层做一些处理其他资源Node前后端分离用nodeexpress前后端分离代理json请求,nodeJS转发请求实现跨域访问
