Node.js框架之express
Express介紹
npm提供了大量的第三方模組,其中不乏許多Web框架,比如我們本章節要講述的一個輕量級的Web框架 ——— Express。
Express是一個簡潔、靈活的node.js Web應用開發框架, 它提供一系列強大的功能,比如:模板解析、靜態檔案服務、中介軟體、路由控制等等,並且還可以使用外掛或整合其他模組來幫助你建立各種 Web和移動裝置應用,是目前最流行的基於Node.js的Web開發框架,並且支援Ejs、jade等多種模板,可以快速地搭建一個具有完整功能的網站。
好,下面我們就開始吧!
1. NPM安裝
npm install express
2. 獲取、引用
var express = require('express');
var app = express();
通過變數“app”我們就可以呼叫express的各種方法了,好戲剛剛開始,繼續加油吧!
建立應用
認識了Express框架,我們開始建立我們的第一個express應用。
在我們的預設專案主檔案app.js新增如下內容:
var express = require('express');
var app = express();
app.get('/', function (request, response) {
response.send('Hello World!');
});
app.listen(80);
說明:在後面課程學習中,我們會統一使用80埠用於監聽請求。
新增完畢之後,通過右側欄的“測試地址”來檢視瀏覽器內容,當看到“Hello World!”內容就表明一個簡單的express應用已經建立成功了。
get請求
前面我們實現了一個簡單的express應用,下面我們就開始具體講述它的具體實現,首先我們先來學習Express的常用方法。
get方法 —— 根據請求路徑來處理客戶端發出的GET請求。
格式:app.get(path,function(request, response));
path為請求的路徑,第二個引數為處理請求的回撥函式,有兩個引數分別是request和response,代表請求資訊和響應資訊。
如下示例:
var express = require('express');
var app = express();
app.get('/', function(request, response) {
response.send('Welcome to the homepage!');
});
app.get('/about', function(request, response) {
response.send('Welcome to the about page!');
});
app.get("*", function(request, response) {
response.send("404 error!");
});
app.listen(80);
上面示例中,指定了about頁面路徑、根路徑和所有路徑的處理方法。並且在回撥函式內部,使用HTTP回應的send方法,表示向瀏覽器傳送一個字串。
參照以上程式碼,試試自己設定一個get請求路徑,然後瀏覽器訪問該地址是否可以請求成功。
Middleware<中介軟體>
1.什麼是中介軟體?
中介軟體(middleware)就是處理HTTP請求的函式,用來完成各種特定的任務,比如檢查使用者是否登入、分析資料、以及其他在需要最終將資料傳送給使用者之前完成的任務。 它最大的特點就是,一箇中介軟體處理完,可以把相應資料再傳遞給下一個中介軟體。
2.一個不進行任何操作、只傳遞request物件的中介軟體,大概是這樣:
function Middleware(request, response, next) {
next();
}
上面程式碼的next為中介軟體的回撥函式。如果它帶有引數,則代表丟擲一個錯誤,引數為錯誤文字。
function Middleware(request, response, next) {
next('出錯了!');
}
丟擲錯誤以後,後面的中介軟體將不再執行,直到發現一個錯誤處理函式為止。如果沒有呼叫next方法,後面註冊的函式也是不會執行的。
all函式的基本用法
和get函式不同app.all()函式可以匹配所有的HTTP動詞,也就是說它可以過濾所有路徑的請求,如果使用all函式定義中介軟體,那麼就相當於所有請求都必須先通過此該中介軟體。
格式:app.all(path,function(request, response));
如下所示,我們使用all函式在請求之前設定響應頭屬性。
var express = require("express");
var app = express();
app.all("*", function(request, response, next) {
response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //設定響應頭屬性值
next();
});
app.get("/", function(request, response) {
response.end("歡迎來到首頁!");
});
app.get("/about", function(request, response) {
response.end("歡迎來到about頁面!");
});
app.get("*", function(request, response) {
response.end("404 - 未找到!");
});
app.listen(80);
上面程式碼引數中的“*”表示對所有路徑有效,這個方法在給特定字首路徑或者任意路徑上處理時會特別有用,不管我們請求任何路徑都會事先經過all函式。
如果所示,如果我們跳過all函式又會怎麼樣呢,自己動手試一試?
use基本用法1
use是express呼叫中介軟體的方法,它返回一個函式。
格式:app.use([path], function(request, response, next){});
//可選引數path預設為"/"。
1. 使用中介軟體
app.use(express.static(path.join(__dirname, '/')));
如上呢,我們就使用use函式呼叫express中介軟體設定了靜態檔案目錄的訪問路徑(這裡假設為根路徑)。
2. 如何連續呼叫兩個中介軟體呢,如下示例:
var express = require('express');
var app = express();
app.use(function(request, response, next){
console.log("method:"+request.method+" ==== "+"url:"+request.url);
next();
});
app.use(function(request, response){
response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
response.end('示例:連續呼叫兩個中介軟體');
});
app.listen(80);
回撥函式的next引數,表示接受其他中介軟體的呼叫,函式體中的next(),表示將請求資料傳遞給下一個中介軟體。
上面程式碼先呼叫第一個中介軟體,在控制檯輸出一行資訊,然後通過next(),呼叫第二個中介軟體,輸出HTTP回應。由於第二個中介軟體沒有呼叫next方法,所以req物件就不再向後傳遞了。
use基本用法2
use方法不僅可以呼叫中介軟體,還可以根據請求的網址,返回不同的網頁內容,如下示例:
var express = require("express");
var app = express();
app.use(function(request, response, next) {
if(request.url == "/") {
response.send("Welcome to the homepage!");
}else {
next();
}
});
app.use(function(request, response, next) {
if(request.url == "/about") {
response.send("Welcome to the about page!");
}else {
next();
}
});
app.use(function(request, response) {
response.send("404 error!");
});
app.listen(80);
上面程式碼通過request.url屬性,判斷請求的網址,從而返回不同的內容。
回撥函式
Express回撥函式有兩個引數,分別是request(簡稱req)和response(簡稱res),request代表客戶端發來的HTTP請求,request代表發向客戶端的HTTP回應,這兩個引數都是物件。示例如下:
function(req, res) {
});
在後面的學習中,我們會經常和它打交道,牢牢記住它的格式吧!
獲取主機名、路徑名
今天我們就先來學習如何使用req物件來處理客戶端發來的HTTP請求。
req.host返回請求頭裡取的主機名(不包含埠號)。
req.path返回請求的URL的路徑名。
如下示例:
var express = require('express');
var app = express();
app.get("*", function(req, res) {
console.log(req.path);
res.send("req.host獲取主機名,req.path獲取請求路徑名!");
});
app.listen(80);
試一試在瀏覽器中輸入任意一個請求路徑,通過req檢視主機名或請求路徑。
query基本用法
query是一個可獲取客戶端get請求路徑引數的物件屬性,包含著被解析過的請求引數物件,預設為{}。
var express = require('express');
var app = express();
app.get("*", function(req, res) {
console.log(req.query.引數名);
res.send("測試query屬性!");
});
app.listen(80);
通過req.query獲取get請求路徑的物件引數值。
格式:req.query.引數名;請求路徑如下示例:
例1: /search?n=Lenka
req.query.n // "Lenka"
例2: /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order // "desc"
req.query.shoe.color // "blue"
req.query.shoe.type // "converse"
試一試get請求一個帶引數路徑,使用“req.query.引數名”方法獲取請求引數值。
param基本用法
和屬性query一樣,通過req.param我們也可以獲取被解析過的請求引數物件的值。
格式:req.param("引數名");請求路徑如下示例:
例1: 獲取請求根路徑的引數值,如/?n=Lenka,方法如下:
var express = require('express');
var app = express();
app.get("/", function(req, res) {
console.log(req.param("n")); //Lenka
res.send("使用req.param屬性獲取請求根路徑的引數物件值!");
});
app.listen(80);
例2:我們也可以獲取具有相應路由規則的請求物件,假設路由規則為 /user/:name/,請求路徑/user/mike,如下:
app.get("/user/:name/", function(req, res) {
console.log(req.param("name")); //mike
res.send("使用req.param屬性獲取具有路由規則的引數物件值!");
});
PS:所謂“路由”,就是指為不同的訪問路徑,指定不同的處理方法。
看了上面的示例,試一試使用req.param屬性解析一個請求路徑物件,並獲取請求引數值。
params基本用法
和param相似,但params是一個可以解析包含著有複雜命名路由規則的請求物件的屬性。
格式:req.params.引數名;
例1. 如上課時請求根路徑的例子,我們就可以這樣獲取,如下:
var express = require('express');
var app = express();
app.get("/user/:name/", function(req, res) {
console.log(req.params.name); //mike
res.send("使用req.params屬性獲取具有路由規則的引數物件值!");
});
app.listen(80);
檢視執行結果,和param屬性功能是一樣的,同樣獲取name引數值。
例2:當然我們也可以請求複雜的路由規則,如/user/:name/:id,假設請求地址為:/user/mike/123,如下:
app.get("/user/:name/:id", function(req, res) {
console.log(req.params.id); //"123"
res.send("使用req.params屬性複雜路由規則的引數物件值!");
});
對於請求地址具有路由規則的路徑來說,屬性params比param屬性是不是又強大了那麼一點點呢!
send基本用法
send()方法向瀏覽器傳送一個響應資訊,並可以智慧處理不同型別的資料。格式如下: res.send([body|status], [body]);
1.當引數為一個String時,Content-Type預設設定為"text/html"。
res.send('Hello World'); //Hello World
2.當引數為Array或Object時,Express會返回一個JSON。
res.send({ user: 'tobi' }); //{"user":"tobi"}
res.send([1,2,3]); //[1,2,3]
3.當引數為一個Number時,並且沒有上面提到的任何一條在響應體裡,Express會幫你設定一個響應體,比如:200會返回字元"OK"。
res.send(200); // OK
res.send(404); // Not Found
res.send(500); // Internal Server Error
send方法在輸出響應時會自動進行一些設定,比如HEAD資訊、HTTP快取支援等等。
更多示例和線上練習可以去這裡看看: http://www.hubwiz.com/course/544db33888dba01ef09d0682/
相關文章
- Node.js Express 框架Node.jsExpress框架
- Node.js之Express詳解Node.jsExpress
- Express 4.x Node.js的Web框架ExpressNode.jsWeb框架
- [譯]Node.js框架對比:Express/Koa/HapiNode.js框架ExpressAPI
- Node.js學習之路24——Express框架的app物件Node.jsExpress框架APP物件
- IBM 向 Node.js 捐贈 Express 框架,為 Express 醜聞畫上了句號IBMNode.jsExpress框架
- 初步瞭解Express(基於node.js的後端框架)ExpressNode.js後端框架
- express框架Express框架
- Web框架expressWeb框架Express
- MAC下安裝Node.js(Express框架)連線redis資料庫MacNode.jsExpress框架Redis資料庫
- JavaScript學習筆記(四十八)——Node.js之ExpressJavaScript筆記Node.jsExpress
- Node.js 配合 express 框架、ejs 、mongodb 實現應用 && [使用 TypeScript 重構]Node.jsExpress框架MongoDBTypeScript
- 初次接觸express框架Express框架
- node框架express的研究框架Express
- Express 實戰(二):Node.js 基礎ExpressNode.js
- Express框架(二)—— 中介軟體Express框架
- node express web開發框架ExpressWeb框架
- Node.js和express系列學習資料Node.jsExpress
- Node.js + Express 認證微信公眾號Node.jsExpress
- node.js,express入門看詳細篇Node.jsExpress
- Node.js Express 獲取request原始資料Node.jsExpress
- Node之Express模板Express
- Node.js學習之路27——Express的router物件Node.jsExpress物件
- Node.js學習之路25——Express的request物件Node.jsExpress物件
- 用 Express 和 AbsurdJS 做 Node.js 應用ExpressNode.js
- node中express框架使用詳解Express框架
- express框架+mongodb簡易學生管理Express框架MongoDB
- nodejs express 框架解密4-路由NodeJSExpress框架解密路由
- Node.js學習(第四章:初見express)Node.jsExpress
- Node.js 教程第九篇——Express 檔案上傳Node.jsExpress
- node.js的express模組實現GET和POST請求Node.jsExpress
- [Day2] Node.js利用Express訪問index.htmlNode.jsExpressIndexHTML
- Creating Isomorphic Apps with Node.js, React, and ExpressAPPNode.jsReactExpress
- nodejs express 框架解密5-檢視NodeJSExpress框架解密
- 用原生http 實現簡單 Express 框架HTTPExpress框架
- CentOS安裝執行NodeJS框架ExpressCentOSNodeJS框架Express
- 如何使用Node.js、TypeScript和Express實現RESTful API服務Node.jsTypeScriptExpressRESTAPI
- node-express框架本地模擬介面資料Express框架