(九)nodejs循序漸進-Express框架(進階篇)

Express 框架

Express 是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用,和豐富的 HTTP 工具。

使用 Express 可以快速地搭建一個完整功能的網站。

Express 框架核心特性:

  • 可以設置中間件來響應 HTTP 請求。

  • 定義了路由表用于執行不同的 HTTP 請求動作。

  • 可以通過向模板傳遞參數來動態渲染 HTML 頁面。


安裝 Express

安裝 Express 并將其保存到依賴列表中:

$ npm install express --save

以上命令會將 Express 框架安裝在當前目錄的?node_modules?目錄中,?node_modules?目錄下會自動創建 express 目錄。以下幾個重要的模塊是需要與 express 框架一起安裝的:

  • body-parser?- node.js 中間件,用于處理 JSON, Raw, Text 和 URL 編碼的數據。

  • cookie-parser?- 這就是一個解析Cookie的工具。通過req.cookies可以取到傳過來的cookie,并把它們轉成對象。

  • multer?- node.js 中間件,用于處理 enctype="multipart/form-data"(設置表單的MIME編碼)的表單數據。

$ npm install body-parser --save
$ npm install cookie-parser --save
$ npm install multer --save

安裝完后,我們可以查看下 express 使用的版本號:

$ npm list express
/data/www/node
└── express@4.15.2  -> /Users/tianqixin/www/node/node_modules/.4.15.2@express

第一個 Express 框架實例

接下來我們使用 Express 框架來輸出 "Hello World"。

以下實例中我們引入了 express 模塊,并在客戶端發起請求后,響應 "Hello World" 字符串。

創建 express_demo.js 文件,代碼如下所示:

express_demo.js 文件代碼:

//express_demo.js 文件
var express = require('express');
var app = express();app.get('/', function (req, res) {res.send('Hello World');
})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("應用實例,訪問地址為 http://%s:%s", host, port)})

執行以上代碼:

$ node express_demo.js 
應用實例,訪問地址為 http://localhost:8081

在瀏覽器中訪問 http://localhost:8081,結果如下圖所示:

請求和響應

?

Express 應用使用回調函數的參數:?request?和?response?對象來處理請求和響應的數據。

app.get('/', function (req, res) {// --
})

request?和?response?對象的具體介紹:

Request 對象?- request 對象表示 HTTP 請求,包含了請求查詢字符串,參數,內容,HTTP 頭部等屬性。常見屬性有:

  1. req.app:當callback為外部文件時,用req.app訪問express的實例
  2. req.baseUrl:獲取路由當前安裝的URL路徑
  3. req.body / req.cookies:獲得「請求主體」/ Cookies
  4. req.fresh / req.stale:判斷請求是否還「新鮮」
  5. req.hostname / req.ip:獲取主機名和IP地址
  6. req.originalUrl:獲取原始請求URL
  7. req.params:獲取路由的parameters
  8. req.path:獲取請求路徑
  9. req.protocol:獲取協議類型
  10. req.query:獲取URL的查詢參數串
  11. req.route:獲取當前匹配的路由
  12. req.subdomains:獲取子域名
  13. req.accepts():檢查可接受的請求的文檔類型
  14. req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一個可接受字符編碼
  15. req.get():獲取指定的HTTP請求頭
  16. req.is():判斷請求頭Content-Type的MIME類型

Response 對象?- response 對象表示 HTTP 響應,即在接收到請求時向客戶端發送的 HTTP 響應數據。常見屬性有:

  1. res.app:同req.app一樣
  2. res.append():追加指定HTTP頭
  3. res.set()在res.append()后將重置之前設置的頭
  4. res.cookie(name,value [,option]):設置Cookie
  5. opition: domain / expires / httpOnly / maxAge / path / secure / signed
  6. res.clearCookie():清除Cookie
  7. res.download():傳送指定路徑的文件
  8. res.get():返回指定的HTTP頭
  9. res.json():傳送JSON響應
  10. res.jsonp():傳送JSONP響應
  11. res.location():只設置響應的Location HTTP頭,不設置狀態碼或者close response
  12. res.redirect():設置響應的Location HTTP頭,并且設置狀態碼302
  13. res.render(view,[locals],callback):渲染一個view,同時向callback傳遞渲染后的字符串,如果在渲染過程中有錯誤發生next(err)將會被自動調用。callback將會被傳入一個可能發生的錯誤以及渲染后的頁面,這樣就不會自動輸出了。
  14. res.send():傳送HTTP響應
  15. res.sendFile(path [,options] [,fn]):傳送指定路徑的文件 -會自動根據文件extension設定Content-Type
  16. res.set():設置HTTP頭,傳入object可以一次設置多個頭
  17. res.status():設置HTTP狀態碼
  18. res.type():設置Content-Type的MIME類型

路由

我們已經了解了 HTTP 請求的基本應用,而路由決定了由誰(指定腳本)去響應客戶端請求。

在HTTP請求中,我們可以通過路由提取出請求的URL以及GET/POST參數。

接下來我們擴展 Hello World,添加一些功能來處理更多類型的 HTTP 請求。

創建 express_demo2.js 文件,代碼如下所示:

express_demo2.js 文件代碼:

var express = require('express'); var app = express(); // 主頁輸出 "Hello World" app.get('/', function (req, res) { console.log("主頁 GET 請求"); res.send('Hello GET'); }) // POST 請求 app.post('/', function (req, res) { console.log("主頁 POST 請求"); res.send('Hello POST'); }) // /del_user 頁面響應 app.get('/del_user', function (req, res) { console.log("/del_user 響應 DELETE 請求"); res.send('刪除頁面'); }) // /list_user 頁面 GET 請求 app.get('/list_user', function (req, res) { console.log("/list_user GET 請求"); res.send('用戶列表頁面'); }) // 對頁面 abcd, abxcd, ab123cd, 等響應 GET 請求 app.get('/ab*cd', function(req, res) { console.log("/ab*cd GET 請求"); res.send('正則匹配'); }) var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log("應用實例,訪問地址為 http://%s:%s", host, port) })

執行以上代碼:

$ node express_demo2.js 
應用實例,訪問地址為 http://0.0.0.0:8081

接下來你可以嘗試訪問 http://127.0.0.1:8081 不同的地址,查看效果。

在瀏覽器中訪問 http://127.0.0.1:8081/list_user,結果如下圖所示:

在瀏覽器中訪問 http://127.0.0.1:8081/abcd,結果如下圖所示:

在瀏覽器中訪問 http://127.0.0.1:8081/abcdefg,結果如下圖所示:


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444541.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode326. 3的冪 如此6的操作你想到了嗎

給定一個整數,寫一個函數來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4: 輸入: 45 輸出: false 進階: 你能不使用循環或者遞歸來完成本題嗎? 注意最后一句…

(十)nodejs循序漸進-高性能游戲服務器框架pomelo之介紹和安裝篇

目錄 Pomelo 安裝Pomelo 創建demoserver項目 pomelo命令 項目結構說明 pomelo框架 架構 服務器實現 客戶端請求與響應、廣播的抽象介紹 Pomelo pomelo是一個快速、可擴展、Node.js分布式游戲服務器框架,對游戲服務器開發感興趣的同學可以關注關注。 之前…

leetcode344. 反轉字符串 史上最簡單力扣題

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中的所有字符都是 ASCII 碼表中的可打印字符。…

(十一)nodejs循序漸進-高性能游戲服務器框架pomelo之啟動流程和組件

游戲啟動過程 啟動入口 在使用pomelo進行游戲開發時,工程目錄下的app.js是整個游戲服務器的啟動運行入口。app.js中創建項目,進行默認配置并啟動服務器的代碼如下: var pomelo require(pomelo); var app pomelo.createApp(); app.set(na…

(十二)nodejs循序漸進-高性能游戲服務器框架pomelo之創建一個游戲聊天服務器

上個章節我們簡單介紹了下pomelo的安裝和目錄結構,有讀者可能覺得有點吃不消,為什么不再深入講一講目錄結構和里邊的庫,這里我就不費口舌了,大家可以去官網參考文檔說明,本文只告訴大家如何利用這個框架來開發自己的東…

看這玩意復習你還會掛科?《軟件工程篇》

軟件工程:是指導軟件開發和維護的一門工程學科 三要素方法/工具/開發過程 價值:促進項目成功 現代產品開發三原則:功用性、可行性、稱許性 軟件過程是軟件工程的核心組成部分。 迭代 :反復求精 增量:逐塊建造 需…

C++:02---命名空間

一、概念: ①類似于倉庫,空間內存儲代碼,需要用到時調用②也為防止名字沖突提供了更加可控的機制二、命名空間的定義 定義的基本格式如下:namespace 命名空間名 { //一系列聲明與定義 };三、命名空間的注意事項 命名空間定義時最后的分號可有可無只要出現在全局作用域中的…

看這玩意復習你還會掛科?《軟件工程2篇》

第一章: 軟件工程定義: 1968年10月,Fritz Bauer 首次提出了“軟件工程”的概念,并將“軟件工程”定義為:為了經濟地獲得能夠在實際機器上有效運行的可靠軟件,而建立并使用的一系列工程化原則。 1993年IE…

C++:05---命名空間

一、概念: ①類似于倉庫,空間內存儲代碼,需要用到時調用②也為防止名字沖突提供了更加可控的機制二、命名空間的定義 定義的基本格式如下:namespace 命名空間名 { //一系列聲明與定義 };三、命名空間的注意事項 命名空間定義時最后的分號可有可無只要出現在全局作用域中的…

C++:04---內聯函數

1.概念: 內聯類似于宏定義,當程序執行到內聯函數時,相當于復制了一份函數代碼。犧牲代碼空間,贏得了時間 內聯說明只是向編譯器發出一個請求,編譯器可以選擇忽略這個請求 2.關鍵字:inline 聲明時寫了inline,定義時可省略。建議聲明和定義都加上inlineinline int add(int…

leetcode86. 分隔鏈表

給定一個鏈表和一個特定值 x,對鏈表進行分隔,使得所有小于 x 的節點都在大于或等于 x 的節點之前。 你應當保留兩個分區中每個節點的初始相對位置。 示例: 輸入: head 1->4->3->2->5->2, x 3 輸出: 1->2->2->4->3->5…

(十三)nodejs循序漸進-高性能游戲服務器框架pomelo之擴展聊天服務器為機器人自動聊天

聊天服務器擴展 大家在上一篇文章里相信已經學會了pomelo框架的基本用法了,那么我們在上一篇文章的代碼基礎上繼續擴展,豐富系統,另外也熟悉下他的更多的用法,這一節我將擴展它:增加一個機器人自動聊天的功能。 目的…

C++:09---類靜態成員、類常量成員

一、類靜態成員(static) 先介紹一下什么是靜態變量、靜態函數 靜態局部變量:存在域(全局數據區),作用域(塊作用域)靜態全局變量:存在域(全局數據區),作用域(整個文件)靜態函數:存在域(全局數據區),作用域(整個文件)static int a=10;//全局靜態變量 static vo…

C++:08---成員變量初始化方式

成員變量初始化有三種方式: 在構造函數體內賦值初始化在自定義的公有函數體中賦值初始化(一般用于成員變量的初始化)在構造函數的成員初始化列表初始化一、構造函數體內初始化 說明:在構造函數體內的初始化方式,本質是是為成員變量賦值,而不是真正意義上的初始化,這點要…

leetcode1290. 二進制鏈表轉整數 刷新認知,最簡單算法題

給你一個單鏈表的引用結點 head。鏈表中每個結點的值不是 0 就是 1。已知此鏈表是一個整數數字的二進制表示形式。 請你返回該鏈表所表示數字的 十進制值 。 示例 1: 輸入:head [1,0,1] 輸出:5 解釋:二進制數 (101) 轉化為十進…

Redis:02---安裝Redis(Linux+Windows+Docker)

Linux安裝:一、安裝方式1(下載源碼編譯安裝)第一步:從下面的網址中下載Redis最新穩定版本的源代碼sudo wget http://download.redis.io/redis-stable.tar.gz第二步:下載完之后解壓,建立一個軟鏈接指向于red…

C++:10---再議拷貝構造函數

一、概念 使用一個已經存在的對象,去構造(初始化)另一個對象二、格式 參數加上const&,因為拷貝構造函數在幾種情況下都會被隱式地使用,因此拷貝構造函數不應該是explict的const:防止函數內部修改值&:防止無限循環拷貝類名(類名 const& 參數名) { 函數體 }三、…

人的思維謬誤與心理學效應

啟發法 用一個容易的問題代替難以回答的真正問題。這個容易的問題的答案就是對真正問題的啟發,但啟發經常和真正的答案差得很遠,而人卻往往把啟發當成了真正問題的答案。 接下來介紹和啟發法相關的心理效應和謬誤。每一個謬誤都會注明真正的問題是什么…

C++:07---this指針

一、this指針介紹 概念:this指針是成員函數的一個隱式參數,在類中本質上就是對象的指針(常量指針)特點:在成員函數中可通過this指針區別成員變量與形參變量this可以顯式調用示例代碼:class Cperson { private: int age; float height; public: void InitPerson(int age,flo…

Redis :01---Redis簡介和安裝

一、Redis簡介 Redis官網:https://redis.io/ Redis是一種基于鍵值對(key-value)的NoSQL數據庫 與很多鍵值對數據庫不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、 list&…