node中間層
一、總結
1、node中間層作用:前端也是mvc,NodeJS之后,前端可以更加專注於視圖層,而讓更多的數據邏輯放在Node層處理
2、node中間層作用:當發現所有請求量太多應付不過來的時候就可以考慮做這樣的分離,將處理頁面渲染的請求分給另一個服務,擋在前面,自己只負責數據相關的請求。nodejs擅長處理io密集型任務,很適合做處理頁面渲染的服務
3、node中間層作用:功能分離,減輕板塊負擔
4、善用學習網站(不只善用搜索引擎):去菜鳥教程或者別的里面首頁可以了解例如node.js的作用
5、node.js:部署在服務器上的js,可以部署一些高性能服務。
簡單的說 Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基於Chrome JavaScript 運行時建立的一個平台。
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。
如果你是一個前端程序員,你不懂得像PHP、Python或Ruby等動態編程語言,然后你想創建自己的服務,那么Node.js是一個非常好的選擇。
Node.js 是運行在服務端的 JavaScript,如果你熟悉Javascript,那么你將會很容易的學會Node.js。
當然,如果你是后端程序員,想部署一些高性能的服務,那么學習Node.js也是一個非常好的選擇。
二、從NodeJS搭建中間層再談前后端分離
之前在知道創宇的項目中有用到過nodejs作中間層,當時還不太理解其背后真正的原因;后來在和一位學長交談的過程中,也了解到螞蟻金服也在使用類似的方法,使用nodejs作為中間層去請求真實后台的數據;之后人到北京,也見到現在的公司也在往nodejs后端方向靠攏。隨着知識的增加,加之自己查閱資料,慢慢總結出了一些原理。
從做微信小程序引發的思考
最近出於愛好,寫了個音樂播放器的微信小程序(原本想用vue寫的,后來因為公司業務原因,年后可能去做微信小程序,所以就換了前端技術棧),源碼在我的GitHub上: wx-audio 。
思考:后端出於性能和別的原因,提供的接口所返回的數據格式也許不太適合前端直接使用,前端所需的排序功能、篩選功能,以及到了視圖層的頁面展現,也許都需要對接口所提供的數據進行二次處理。這些處理雖可以放在前端來進行,但也許數據量一大便會浪費瀏覽器性能。因而現今,增加node端便是一種良好的解決方案。
在我的微信小程序demo的server端代碼中,我通過http模塊對真實后台(網易雲音樂API)發起http請求,然后通過express模塊搭建后端服務。
發起請求:
// http.js
var formatURL = require('./formatURL.js'); var http = require('http'); const POSThttp = function(request){ return new Promise((resolve, reject) => { let body = ''; // http模塊拿到真實后台api的數據 http.get(formatURL(request.body.musicname), function(res){ res.on('data', (data) => { body += data; }).on('end', () => { // 格式化 const { name, audio: musicUrl, page, album: { name: musicName, picUrl, }, artists: [{ name: singer, }], } = JSON.parse(body).result.songs[0]; const reply = { name, picUrl, musicUrl, page, singer, }; resolve(reply); }); }); }); }; module.exports = POSThttp;
得到數據傳回前端:
var express = require('express'); var POSThttp = require('./POSThttp.js'); var bodyParser = require('body-parser'); // 使用body-parser解析post請求的參數,如果沒有,req.body為undefined。 var app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post('/', (req, res) => { POSThttp(req).then((data) => { res.send(data); }).catch((err) => { res.send(err); }); }); app.listen(3000, () => { console.log('open wx-audio server successful!') });
這幾十行代碼也就實現了一個簡單的中間層的demo,並做到了在中間層格式化參數,便於前端進行使用的過程。
為什么需要中間層?
其實這個問題,我認為跟面試常考的題:“為什么需要前后端分離?”是類似的,其原因可以歸納為以下幾點:
現今網站存在問題
之前有向一位在百度有多年工作經驗的老前輩交談這類問題,我所提到的搜狐公司代碼冗余、前后端耦合的問題,他是這么回答並且給予我這樣的建議:



其實,提煉出來,現今大公司的老項目(包括百度、搜狐等公司所采用的后端渲染等),或多或少都會存在這樣的一些 問題 :
- 前端代碼越來越復雜
- 前后端依舊高度耦合
- 無法良好的支持跨終端
前輩們提出的解決方案
參考 淘寶前后端分離解決方案
- 前端代碼越來越復雜,我們希望盡可能地減少工作量,開始使用類似MV*的分層結構,使前端后分離成為必要。
- 前端需要處理更多的工作,希望有權操控View,Router(如:SPA的嘗試)
- 各種終端設備的興起,需要我們把頁面適配到更多的地方。
開始:我們所嘗試的CLIENT-SIDE MV* 框架,后端暴露數據接口、處理業務邏輯,前端接收數據、處理渲染邏輯。
關於MVC的定義:
MVC是一種設計模式,它將應用划分為3個部分:數據(模型)、展現層(視圖)和用戶交互(控制器)。換句話說,一個事件的發生是這樣的過程:
1. 用戶和應用產生交互。
2. 控制器的事件處理器被觸發。
3. 控制器從模型中請求數據,並將其交給視圖。
4. 視圖將數據呈現給用戶。
我們不用類庫或框架就可以實現這種MVC架構模式。關鍵是要將MVC的每部分按照職責進行划分,將代碼清晰地分割為若干部分,並保持良好的解耦。這樣可以對每個部分進行獨立開發、測試和維護。

如:Backbone, EmberJS, KnockoutJS, AngularJS等框架。

但這樣的方式仍舊存在問題:
各層職責重疊
- Client-side Model 是 Server-side Model 的加工
- Client-side View 跟 Server-side是 不同層次的東西
- Client-side的Controller 跟 Sever-side的Controller 各搞各的
- Client-side的Route 但是 Server-side 可能沒有
性能問題
- 渲染,取值都在客戶端進行,有性能的問題
- 需要等待資源到齊才能進行,會有短暫白屏與閃動
- 在移動設備低速網路的體驗奇差無比
重用問題
- 模版無法重用,造成維護上的麻煩與不一致
- 邏輯無法重用,前端的校驗后端仍須在做一次
- 路由無法重用,前端的路由在后端未必存在
跨終端問題
- 業務太靠前,導致不同端重復實現
- 邏輯太靠前,造成維護上的不易
渲染都在客戶端,模版無法重用,SEO實現 麻煩
NodeJS作為中間層的全棧開發方案
有了NodeJS之后,前端可以更加專注於視圖層,而讓更多的數據邏輯放在Node層處理。

我們使用Node層:
- 轉發數據,串接服務
- 路由設計,控制邏輯
- 渲染頁面,體驗優化
- 中間層帶來的性能問題,在異步ajax轉成同步渲染過程中得到平衡
- 更多的可能
其實更為重要的是,對於前端來說,NodeJS的學習成本是相當低的:我們無需學習一門新的語言,就能做到以前開發幫我們做的事情,一切都顯得那么自然。
技術在不斷變化中,唯有跟上技術革新的浪潮,才能不被時代所淘汰,不管是人還是企業。
三、node做中間層是什么意思,能具體詳說么?
問題:
沒接觸過node,經常看文章說node做中間層,不知道具體指什么意思?比如在程序中解決了什么問題,如果說解決了渲染問題,那也是頁面端,前端框架已經解決了,難道說是后端渲染前端框架,然后整個塞到前端嗎?
解答:
很多項目中后端應用往往不止一個服務,而是一群各司其職的服務,比如nginx的存在就是因為服務器上運行着多個服務,而不同的網絡請求由不同的服務處理,需要在這些服務前假設一層nginx做為代理,將請求分發給不同的服務,nginx在這里的角色就相當於中間層。
對於一個比較復雜的web站點,頁面中的請求通常分為兩種,請求頁面與請求數據(ajax)。如果后端是個單體應用,當發現所有請求量太多應付不過來的時候就可以考慮做這樣的分離,將處理頁面渲染的請求分給另一個服務,擋在前面,自己只負責數據相關的請求。nodejs擅長處理io密集型任務,很適合做處理頁面渲染的服務,於是很多人選擇了nodejs。淘寶也是類似的架構,據說現在所有淘寶的頁面都是由node服務渲染的。
講道理就是用nodejs做靜態資源管理和請求轉發。
做到后端只管數據接口,前端負責路由,靜態資源。
加了node的中間層,可以讓前端處理view層和control層,后端只負責處理model層。前后端分離比較徹底,分工更明確一些吧。
另外就是有些框架在服務器不是node的時候SEO比較難做。加了node中間層后比較好做SEO
node就是鏈狀執行
請求接收 -> 中間件1 -> 中間件2 -> ... 中間件n ... -> 返回
中間件就是某一個處理操作
