摘要:一個標(biāo)準(zhǔn)性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應(yīng)的函數(shù),并無任何特殊之處。
在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大的方面了解一下 Node.js 。
在很長的一段時間里,JavaScript 一門編寫瀏覽器中運(yùn)行腳本的語言。不過近些年,隨著互聯(lián)網(wǎng)的發(fā)展以及技術(shù)進(jìn)步,JavaScript 迎來了一個集中爆發(fā)的時代。一個標(biāo)準(zhǔn)性的事件就是 09 年 Node.js 的橫空出世。
Node.js 由 Google Chrome 的 V8 引擎發(fā)展而來,它能夠讓 JavaScript 運(yùn)行在服務(wù)端。從而極大的拓展了 JavaScript 的應(yīng)用場景也讓 JavaScript 全棧成為了一個熱門話題。開發(fā)者不必再去學(xué)習(xí) Ruby、Python、Java 等語言和框架,僅僅依靠 JavaScript 就能完成前后端的大部分開發(fā)任務(wù)。
雖然,從某些方面來說 JavaScript 并不完美甚至還有一些設(shè)計缺陷,但是這并不影響 Nodejs 的流行。V8 引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其中,前后端同一技術(shù)??梢哉f是它最大的殺手锏。而日益豐富的生態(tài)環(huán)境也讓 JavaScript 受到開發(fā)者越來越多的關(guān)注,使用 Node.js 進(jìn)行開發(fā)也變成了一件非常符合潮流的事情了。
和瀏覽器環(huán)境中的 JavaScript 一樣,Node.js 也只提供了構(gòu)建應(yīng)用基本所需的底層接口和特性。而這些底層接口一般都很冗長、難用。所以有人就在 Node.js 的基礎(chǔ)上實現(xiàn)了 Express 框架。其基本理念與 jQuery 類似,通過對底層接口進(jìn)行了封裝,在簡化代碼的同時提供更高級的接口。另外,Express 拓展性也非常強(qiáng)??蚣鼙旧砼c程序的架構(gòu)和業(yè)務(wù)無關(guān),并且你還可以通過第三方庫進(jìn)行功能拓展。
Node.js 應(yīng)用場景Node.js (通常簡稱為 Node )是一個 JavaScript 代碼的運(yùn)行平臺。雖然大多數(shù)情形下 JavaScript 都運(yùn)行在瀏覽器中,但是并沒有任何地方規(guī)定其只能運(yùn)行在瀏覽器中。作為一門編程語言,本質(zhì)上它與 Ruby、Python、C++、PHP 并沒有什么區(qū)別。就像你可以使用 python myfile.py 來運(yùn)行 Python 腳本,你可以使用 ?node myfile.js 來執(zhí)行 JavaScript 程序。
但是 Node 到底有啥優(yōu)點值得我們在服務(wù)端開發(fā)是嘗試呢?
首先,Node.js 的 JavaScript 引擎非常快。畢竟,它是基于以速度著稱的 Google Chrome V8 引擎,可以每秒執(zhí)行幾千條 JavaScript 指令。
其次,Node.js 通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。
用現(xiàn)實生活中的烘焙做類比最恰當(dāng)不過了。假設(shè)現(xiàn)在我需要制作一些松餅,那么首先就需要把面粉弄好。而此時我是無法抽身做其他的事情的。但是,一旦我把松餅送進(jìn)烤箱,我就可以抽身做其他的事情而不必干等。
在 Node.js 中,客戶端可能隨時都會給服務(wù)端發(fā)送請求。有可能在你處理一個請求時,另一個請求也被客戶端送達(dá)了。假設(shè),兩個請求都需要訪問數(shù)據(jù)庫。那么就可以在第一個請求進(jìn)行數(shù)據(jù)庫操作時,轉(zhuǎn)去處理第二個請求。雖然不能同時對兩者做成響應(yīng),但是我們可以使用異步方式跳過對耗時操作結(jié)果的等待直接處理后續(xù)請求。而其他的一些運(yùn)行環(huán)境默認(rèn)是沒有此能力的。例如,Ruby on Rails 同時時間只能處理一個請求。如果想提高程序的并發(fā)能力,那么你就需要去購買更多的服務(wù)器。
下圖可以清晰的看出兩者的區(qū)別:
與同步方式相比,異步處理的效率明顯要更高,雖然異步代碼也不是并行處理。
當(dāng)然,這并不是說異步處理機(jī)制讓 Node.js 是世界上最快的語言之一。Node.js 雖然能夠最大化壓制單核 CPU 的性能,但是還是無法與多核處理能力相媲美。其他語言中可以讓你利用多核能力同時執(zhí)行多個任務(wù)。像之前和烘培一樣:你可以購買更多的烤箱來同時烤更多的餅干。Node 正在開始支持這個能力,但是它并不像其他語言中那樣重要。
就我個人而言,因為性能而選擇 Node.js 并不是最重要的依據(jù),雖然,它確實比 Ruby、Python 等腳步語言要快。最大的理由是,它在前后端開發(fā)中使用同一種語言。
通常,在編寫 Web 應(yīng)用程序時你都會要使用 JavaScript。但是在 Node.js 出現(xiàn)之前,前后端的開發(fā)必須使用不同的語言進(jìn)行。為此你需要學(xué)習(xí)多種的語言和框架。有了 Node.js 之后,你就可以使用一門語言在前后端開發(fā)中自由切換,這是最吸引人的地方。
什么是 Express ?Express 是一個基于 Node.js 封裝的上層服務(wù)框架,它提供了更簡潔的 API 更實用的新功能。它通過中間件和路由讓程序的組織管理變的更加容易;它提供了豐富的 HTTP 工具;它讓動態(tài)視圖的渲染變的更加容易;它還定義了一組可拓展標(biāo)準(zhǔn)。
Node.js 的功能通過一個簡單的 JavaScript 函數(shù),你就可以利用 Node.js 創(chuàng)建一個 Web 程序。該函數(shù)用于監(jiān)聽來自瀏覽器或者其他設(shè)備的發(fā)起的網(wǎng)絡(luò)請求。當(dāng)接收到一個請求后,函數(shù)會分析請求的內(nèi)容并做成相應(yīng)的處理。例如,當(dāng)你請求站點主頁時,該函數(shù)就會知道知道你的目的并將主頁的 HTML 渲染出來。如果是請求某個 API 接口,該函數(shù)就會把對應(yīng)的 JSON 數(shù)據(jù)返回給客戶端。
假設(shè),現(xiàn)在需要服務(wù)器返回當(dāng)前時間和時區(qū)信息給用戶,那么該程序大致包括如下功能:
如果客戶端發(fā)起主頁請求,Web 應(yīng)用將會返回一個包含所需信息的 HTML 。
如果客戶端訪問地址錯誤,Web 應(yīng)用將會返回 HTTP 404 錯誤,并附帶一段錯誤描述。
如果直接在 Node.js 之上構(gòu)建該應(yīng)用而不使用 Express 的話,那么完整流程圖大抵如下:
在上述流程中,開發(fā)人員只需要關(guān)注圓圈部分內(nèi)容處理。
這個用于處理瀏覽器請求的 JavaScript 函數(shù)叫做請求處理函數(shù)(request handler)。它也僅僅是一個處理請求并作出響應(yīng)的 JavaScript 函數(shù),并無任何特殊之處。Node.js 的 HTTP 服務(wù)會接管其中的網(wǎng)絡(luò)連接,所以你無需關(guān)注和處理復(fù)雜的網(wǎng)絡(luò)協(xié)議內(nèi)容。
從代碼角度來說,該函數(shù)包含兩個參數(shù):一個是網(wǎng)絡(luò)請求 request 對象 ,另一個表示網(wǎng)絡(luò)響應(yīng)的 response 對象。在前面時間信息應(yīng)用中,該請求處理函數(shù)會檢查請求 URL 。如果請求的是主頁,那么就返回成功的響應(yīng)頁面。否則,返回 404 錯誤。沒有 Node.js 應(yīng)用中都是這么處理的:編寫處理函數(shù)對請求作出響應(yīng),非常的簡單。
問題在于,Node.js 的 API 對開發(fā)者來說并不是非常友好。例如,如果我們想發(fā)送一個 JPEG 圖片的話,可能需要至少 45 行代碼才行。創(chuàng)建可復(fù)用 HTML 模版則更復(fù)雜。另外,Node.js 的 HTTP 模塊雖然強(qiáng)大,但是仍然缺少一些實用特性。
Express 的出現(xiàn)就是為了解決這些問題,讓你能夠高效的使用 Node.js 來編寫 Web 應(yīng)用。
Express 給 Node.js 帶來了什么?從大的方面來說,Express 為 Node.js 的 HTTP 模塊帶來了兩大特性:
通過提供大量易用接口,簡化了程序的復(fù)雜度。例如上面放松 JPEG 圖片問題,Express 可以將代碼壓縮帶一行。
它允許對請求處理函數(shù)進(jìn)行拆分,將其重構(gòu)為很多負(fù)責(zé)特定請求的小型請求處理函數(shù)。這便于模塊化和后期維護(hù)。
與上圖相比,下圖是 Express 處理請求的大致流程:
與之前一樣,開發(fā)者只需要關(guān)注圓圈部分的內(nèi)容。
雖然,圖看起來比前面復(fù)雜,但是實際開發(fā)卻更簡單,本質(zhì)上它主要做了兩件事:
與之前一個大型的 request 請求處理函數(shù)不同,這里使用大量小型處理函數(shù)。有些函數(shù)每次都會執(zhí)行(例如,請求日志),而有些函數(shù)只在特定情形下才會觸發(fā)(例如,404 錯誤)。Express 有很多使用的工具能夠?qū)@些處理函數(shù)進(jìn)行區(qū)分。
請求處理函數(shù)中有兩個參數(shù):request 和 response。Node 的 HTTP 可以對其做些基本處理,例如:獲取瀏覽器的 user-agent 。Express 則更為強(qiáng)大,你可以獲取到訪問者 IP 地址,以及解析優(yōu)化過的 URL 請求對象。esponse 對象也同樣得到了增強(qiáng)。通過類似 sendFile 這樣的函數(shù)將文件傳輸代碼壓縮至一行。這極大的簡化了處理函數(shù)的功能實現(xiàn)。
利用 Express 提供的簡潔 API 接口,通過編寫小型 request 請求處理函數(shù),可以極大的壓縮代碼量提高開發(fā)效率。
Express 的最小化理念雖然 Express 是一個框架,但是它的編程規(guī)范非常靈活。你可以用它編寫各種類型的應(yīng)用,從視頻聊天到個人博客等等。另外,Express 本身并不是百寶箱,你可能會在實際開發(fā)中需要使用大量第三方類庫。這些類庫能幫你解決一些次要問題,這樣你可以將關(guān)注點地放在那些重要的問題上,然后發(fā)揚(yáng) Unix do-one-thing-well 的哲學(xué)將事情處理好。
但是這種最小化理念也是一把雙刃劍。一方面,Express 非常靈活可靠,而且不會引入那些無用的垃圾代碼。另一方面,與其他框架相比這種簡潔不可避免導(dǎo)致了部分功能缺失。這意味需要在程序架構(gòu)上做更多的功課,并且在出現(xiàn)問題后要花時間去尋找第三方模塊。離開箱即用還差一點。
有人喜歡靈活多變的框架,而有人則喜歡那些結(jié)構(gòu)固定的框架。例如,PayPal 雖然也使用 Express,但是卻制定了嚴(yán)格的規(guī)范來約束其開發(fā)者。Express 本身并不關(guān)注程序架構(gòu),所以程序員可以根據(jù)偏好自行選擇。由于對程序有著絕對控制權(quán),所以一旦你做出不明智的決策,那么后面的坑你就慢慢爬吧。
對于大型框架和極簡框架的優(yōu)劣,從來都沒有固定的正確答案,所以我們無須太過糾結(jié)。這里,我只希望你記住 Express 是一個極簡框架。
Express 的核心Express 非常簡潔而且對 Node.js 的封裝效果也非常棒,而這一切都源于框架中的四個設(shè)計。
中間件正如之前提到的,原生的 Node.js 使用一個 request 處理函數(shù)應(yīng)對所有請求并做出響應(yīng)。
Middleware 這個名字起的并不好,但是這個術(shù)語并不是 Express 獨有,相反它已經(jīng)存在很久了。概念非常簡單:我們不采用一個巨大的 request 請求處理函數(shù),相反我們將一系列簡單的處理函數(shù)組合起來。每一個小的處理函數(shù)對應(yīng)一個小任務(wù),而這些處理函數(shù)就被稱為中間件。
中間件可以處理各種任務(wù),從記錄請求到發(fā)送靜態(tài)文件到設(shè)置 HTTP 頭部。例如,應(yīng)用中使用的第一個中間件功能可能就是記錄服務(wù)器中每個請求的 logger-log。當(dāng)日志記錄完成后,它將繼續(xù)執(zhí)行調(diào)用鏈中的下一個中間件。而下一個中間件功能可能會去驗證用戶。如果權(quán)限不夠,就會使用“未授權(quán)”進(jìn)行提示。反之則繼續(xù)執(zhí)行下一個中間件。此時中間件功能可能會是渲染主頁并結(jié)束響應(yīng)。下圖演示了這兩種情形:
在圖中可以看出,記錄日志的中間件位于第一個并且肯定會被執(zhí)行。緊接著就是執(zhí)行權(quán)限認(rèn)證的中間件。如果用戶權(quán)限滿足的話就繼續(xù)執(zhí)行下一個中間件,否則就不再執(zhí)行后續(xù)中間件。
中間件最大的特點就是其相對來說比較標(biāo)準(zhǔn),這也意味著開發(fā)者可以通過為 Express 開發(fā)中間件來拓展其功能。同時,這也許意味著某些通用的中間件,很有可能已經(jīng)有人開發(fā)過來,例如: LESS 和 SCSS 等靜態(tài)文件的編譯、權(quán)限控制、cookies 和 sessions 的解析。
路由相比中間件,Routing 顯然更好。與中間價類似,路由對請求處理函數(shù)進(jìn)行了拆分。不同的是,路由根據(jù)請求的 URL 和 HTTP 方法來決定處理方式的。
例如,你的程序中有一個主頁和一個留言板頁面。當(dāng)用戶使用 GET 去請求主頁時,Express 會返回對應(yīng)的主頁內(nèi)容。對留言板的請求的處理也是如此。如果用戶通過 POST 方法在留言板頁面中進(jìn)行了留言操作的話,路由需要做出對應(yīng)處理并刷新頁面。
類似于中間件,上述路由的處理也是通過處理函數(shù)進(jìn)行定義的。而不同的行為會調(diào)用不同的處理函數(shù)。
Express 中的中間件和路由相輔相成。例如:你可以一邊記錄請求日志,同時對主頁路由做出響應(yīng)。
子應(yīng)用Express 應(yīng)用通常都很小,甚至可以是一個文件。隨著應(yīng)用規(guī)模的擴(kuò)張,可能你會將其進(jìn)行拆分為多個文件和文件夾。雖然 Express 對應(yīng)用的規(guī)模增長沒有明確的指導(dǎo)規(guī)則。但是我們可以通過 sub-applications 這一重要特性來作出應(yīng)對。 在 Express 術(shù)語中這些只應(yīng)用也被稱為路由器。
通過實現(xiàn)正常規(guī)模的路由器子應(yīng)用,可以將一個大型應(yīng)用進(jìn)行模塊拆分。甚至你可以對某些子應(yīng)用進(jìn)行更細(xì)致的拆分。例如,在應(yīng)用中可能存在管理后臺、單頁應(yīng)用、API 接口 等等幾個子模塊。這時,你就可以將這些子模塊作為一個子應(yīng)用來實現(xiàn)。詳情如下:
當(dāng)程序規(guī)模變大之后,該特性的優(yōu)勢將會逐步凸顯出來。
易用的 API 函數(shù)Express 由中間件和路由構(gòu)成,在其中你需要編寫大量的異步處理函數(shù)來實現(xiàn)相關(guān)功能。
為了使處理過程更加高效正確,Express 在原生的 Node.js 基礎(chǔ)上進(jìn)行了大量的封裝。在壓縮代碼量提高效率的同時也降低了人為錯誤的概率。除了發(fā)送文件之外,Express 提供的 HTML 渲染功能也讓原生 Node.js 望塵莫及。另外在請求解析方面,Express 也做了非常多的工作。
跟前面的特性不一樣的是,在保持功能強(qiáng)大的同時這些易用的函數(shù)并不會對應(yīng)用造成負(fù)面影響。
Express 生態(tài)環(huán)境像其他的工具一樣,Express 并不是遺世獨立的。
它存活于 Node.js 的生態(tài)中,所有你能找到大量的第三發(fā)模塊提升你的開發(fā)效率,例如數(shù)據(jù)庫連接驅(qū)動。因為Express 可拓展性極強(qiáng),所有整個生態(tài)中存在大量為 Express 開發(fā)的類庫。
Express 跟其他框架的比較Express 既不是第一個 Web 框架,當(dāng)然更不會是最后一個。
同樣,Express 也不是 Node.js 生態(tài)中的唯一框架??赡芩畲蟮母偁帉κ志褪?Hapi.js 了。與 Express 類似,它也有路由、中間件這就概念。不過不同的是它沒有基于 Node.js 的 HTTP 模塊來處理網(wǎng)絡(luò)請求,而是有 Walmart 開發(fā)的網(wǎng)絡(luò)模塊。該模塊被 Mozilla,OpenTable 和 NPM 所接受并在真實程序中檢驗過。作為 Express 的最大競爭對手,因此我懷疑雙方的開發(fā)人員可能彼此抱有不小敵意。
在 Node.js 世界中最流行的大型框架非全棧式的 Meteor 莫屬。相比自由靈活的 Express ,Metero 有著非常嚴(yán)格的程序結(jié)構(gòu)。不同于 Express 只關(guān)注 HTTP 層的處理,Meteor 作為全??蚣芸梢酝瑫r運(yùn)行在客戶端和服務(wù)端。當(dāng)然,這僅僅只是設(shè)計上的選擇說不上到底誰更優(yōu)秀。
跟 Express 基于 Node.js 進(jìn)行封裝類似,也有人對 Express 進(jìn)行更高級的封裝。例如,PayPal 創(chuàng)造的 Kraken 。盡管從技術(shù)角度來說,Kraken 不過只是 Express 的一個中間件而已。但是,它還是做了不少的事情,例如:中間件的安全綁定。Sails.js 則是另一個以 Express 為基礎(chǔ)的新型框架,它內(nèi)置了數(shù)據(jù)庫、WebSocket 集成、API 生產(chǎn)等等功能。所有的這些框架,都是 Express 的一種相對固定化的封裝實現(xiàn)。
Express 最主要的幾個特性之一就是中間件。Connect 是一個僅作用于 Node.js 和中間件的框架。它沒有提供路由和易用函數(shù)接口。而 Express 曾經(jīng)在它的中間件層中使用了 Connect。雖然現(xiàn)在被拋棄了,但是 Express 中間件一直都完全兼容 Connect 中間件。這意味著 Express 的火力得到了更大的提升。
除了上面提到的這些,還有很多使用其它語言實現(xiàn)的 Web 框架。
Express 的很多靈感都來自于 Ruby 世界中的輕型 Web 框架 Sinatra。與 Express 類似,Sinatra 中也有路由和中間件功能。Sinatra 框架思想被其他很多語言所借鑒并且重新實現(xiàn),如果你曾經(jīng)用過這類框架的話,那么對 Express 一定不會陌生。當(dāng)然,Express 也借鑒了 Python 中的 Bottle 和 Flask 框架。
相應(yīng)的,Express 與 Django、Ruby on Rails、ASP.NET 等框架差距巨大。這些框架都十分龐大,而且程序結(jié)構(gòu)也相對固定功能更為豐富。而且,Express 與 PHP 也差異明顯,雖然都是運(yùn)行在服務(wù)上但是后者與 HTML 緊耦合。
Express 僅僅是服務(wù)端 Web 框架中的一種,所以我們不能在這里說 Express 就一定比其他的框架好。它具備一些獨有的特性,例如,Node.js 的性能以及前后端統(tǒng)一的語言。但是與之同時,它的功能遠(yuǎn)比其他框架來的少而去 JavaScript 也并不是一門得到廣大開發(fā)者認(rèn)可的“好”語言。脫離具體場景討論優(yōu)劣勢沒有意義的,下面我們就看看 Express 一些適用場景。
Express 的應(yīng)用場景理論上來說,Express 可以用來構(gòu)建任何 Web 應(yīng)用。對所有請求作出響應(yīng)這件事上述提到的框架同樣能夠做到。所以,為什么要選擇 Express 呢?
最大的優(yōu)點就是 Node.js 中編寫的 JavaScript 可以在瀏覽器和客戶端實現(xiàn)共享。從代碼復(fù)用角度來說,這種情況是最理想的。從心理角度來說也非常有用,開發(fā)過程中無需進(jìn)行服務(wù)器模式和客戶端模式的切換。前端開發(fā)者可以在不學(xué)習(xí)新語言的情況下直接就可以編寫后端代碼。當(dāng)然,前端開發(fā)者還是需要學(xué)習(xí)一些新內(nèi)容的,不然這本書就沒存在的必要了。
Express 可以幫助你做到這一點,人們已經(jīng)為這個技術(shù)棧擬好了名稱:MEAN 。像 “LAMP” 代表 Linux、Apache、MySQL 和 PHP 一樣,“MEAN” 表示 MongoDB、Express、Angular 和 Node.js。人們之所以對它喜愛有加是因為它是純 JavaScript 技術(shù)棧。
Express 常用于驅(qū)動單頁應(yīng)用程序(SPA)。SPA 在前端重度依賴 JavaScript,而且通常需要一個服務(wù)器組件。大多數(shù)服務(wù)器只需要簡單的提供 HTML、CSS 和 JavaScript ,但是有時候 REST API 也是常規(guī)需求。Express 可以同時完成這兩件任務(wù),既可以提供 HTML 也非常適合構(gòu)建 API 。 Express 相對較低的學(xué)習(xí)曲線使得前端開發(fā)者在幾乎無需學(xué)習(xí)新內(nèi)容的情況下搭建一個 SPA 服務(wù)。
當(dāng)你使用 Express 編寫應(yīng)用的時候就決定了你必須使用 MEAN 技術(shù)棧中的 E 和 N 部分,而對于另外兩個 Express 沒有做出過限定你完全可以采用不同的方案。例如,可以使用 Backbone.js 替換其中的 Angular,構(gòu)成 MEBN 技術(shù)棧。使用 SQL 替換 MongoDB 構(gòu)成 SEAN 技術(shù)棧。雖然 MEAN 術(shù)語很常見而且配置也非常流行,但是你完全可以更具需要自行選擇。在這本書中我們將涵蓋的技術(shù)棧是 MEN:MongoDB、Express 和 Node.js。
另外 Express 還具有一些實時特性。雖然其他語言也支持 WebSocket 和 WebRTC,但是 Node.js 似乎要更強(qiáng)。這意味著你可以將這些特性應(yīng)用到 Express 程序中。因為 Node.js 能做的,Express 一樣不少。
Node.js 和 Express 的第三方模塊社區(qū)中存在大量可以在 Express 中使用的模塊。有一些是 Express 獨占的,這些模塊與路由和中間件的特性高度兼容。其他的非獨占模塊也能提升 Express 應(yīng)用的開發(fā)體驗和程序性能。
如果你曾經(jīng)有過 ERB、Jinja2、HAML 等模版引擎的使用經(jīng)驗的話,你就會發(fā)現(xiàn) Express 自帶的功能在渲染 HTML 方面簡直就是弱雞。好在 Express 還可以使用 EJS 和 Jade 這些社區(qū)模版引擎來解決這個問題。
另外,Express 本身并沒有對數(shù)據(jù)庫做支持。你可以通過文件、關(guān)系數(shù)據(jù)庫、或者其他機(jī)制來實現(xiàn)數(shù)據(jù)保存。不過后面將會介紹在 Express 中如何通過 Mongoose 來調(diào)用 MongoDB 數(shù)據(jù)庫。
需要注意的一點是:并不存在 Express 模塊這一概念,所以第三方庫都是 Node.js 模塊。Node.js 模塊與 Express 相互兼容并且能夠配合其工作。所有這些某塊都是在 npm 倉庫注冊的 JavaScript 代碼塊,并且可以使用一致的方法進(jìn)行安裝。與其他環(huán)境中一樣,模塊之間可以相互依賴,并且不同模塊可以相互配合。另外,Express 也不過是 Node.js 中的一個模塊而已。
Hello World每次學(xué)習(xí)新內(nèi)容的時候,絕大多數(shù)都是從 Hello World 開始。
那么現(xiàn)在我們來看看如何使用 Express 構(gòu)建一個簡單的 Hello World 工程。不要太關(guān)注代碼的細(xì)節(jié),后面將會進(jìn)行詳細(xì)介紹。代碼如下:
var express = require("express");? #A ? var app = express();? #B ? app.get("/", function(request, response) {? #C ? response.send("Hello world!");??????????? #C });???????????????????????????????????????? #C ? app.listen(3000, function() {??????????????????? ???#D ? console.log("Express app started on port 3000."); #D });???????????????????????????????????????????????? #D
A:導(dǎo)入 express 模塊并新建變量。
B:創(chuàng)建 app 應(yīng)用
C:設(shè)置訪問 Root 路由,并將響應(yīng)設(shè)置為 “Hello world!”。
D:設(shè)置程序監(jiān)聽的端口,并打贏服務(wù)啟動成功的信息。
再次提醒一下,沒有全部弄懂代碼不要緊,后面會有更詳細(xì)的講解。
你馬上就能學(xué)到關(guān)于 Express 的所有知識了。
小結(jié)本文主要介紹了:
Node.js 可以編寫 Web 應(yīng)用,但是開發(fā)過程并不高效。而 Express 則優(yōu)雅的解決了這些問題。
Express 很小但是也非常靈活
Express 有幾個關(guān)鍵特性:
中間件將程序處理進(jìn)行了拆分并且按照順序鏈?zhǔn)綀?zhí)行。
路由同樣對程序進(jìn)行了拆分,按規(guī)則對不同的訪問請求做出不同的響應(yīng)。
子工程可以實現(xiàn)對大型 Express 的拆分,從而提高可讀性方便后期維護(hù)。
Express 中的代碼大多請求處理函數(shù)的編寫,而 Express 為此提供了大量易用 API 。
原文地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84828.html
摘要:編程書籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來給大家后續(xù)的文章和總結(jié)會繼續(xù)分享,先分享一部分的 編程書籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
摘要:前端日報精選和實現(xiàn)直接當(dāng)前頁預(yù)覽手淘互動動效的探索白話原型和原型鏈源碼解析瀏覽器前端優(yōu)化中文第期深入理解中的動畫演示,提高你的網(wǎng)頁開發(fā)技能知乎專欄實戰(zhàn)一概覽工作機(jī)制第部分迷津欲有問把賣了眾成翻譯代理程序?qū)崿F(xiàn)復(fù)制集搭建及抓包 2017-08-24 前端日報 精選 iframe和HTML5 blob實現(xiàn)JS,CSS,HTML直接當(dāng)前頁預(yù)覽手淘互動動效的探索白話原型和原型鏈React 源碼解...
閱讀 2665·2021-11-22 15:24
閱讀 1402·2021-11-17 09:38
閱讀 2790·2021-10-09 09:57
閱讀 1234·2019-08-30 15:44
閱讀 2474·2019-08-30 14:00
閱讀 3565·2019-08-30 11:26
閱讀 2957·2019-08-29 16:28
閱讀 773·2019-08-29 13:56