Node.js Web框架之Express

Express介紹

npm提供了大量的第三方模塊,其中不乏許多Web框架,好比咱們本章節要講述的一個輕量級的Web框架 ——— Express。html

Express是一個簡潔、靈活的node.js Web應用開發框架, 它提供一系列強大的功能,好比:模板解析、靜態文件服務、中間件、路由控制等等,而且還可使用插件或整合其餘模塊來幫助你建立各類 Web和移動設備應用,是目前最流行的基於Node.js的Web開發框架,而且支持Ejs、jade等多種模板,能夠快速地搭建一個具備完整功能的網站。node

好,下面咱們就開始吧!express

1. NPM安裝npm

npm install express

2. 獲取、引用瀏覽器

var express = require('express');
var app = express();

經過變量「app」咱們就能夠調用express的各類方法了,好戲剛剛開始,繼續加油吧!緩存

建立應用

認識了Express框架,咱們開始建立咱們的第一個express應用。app

在咱們的默認項目主文件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請求。

  1. req.host返回請求頭裏取的主機名(不包含端口號)。

  2. 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/

相關文章
相關標籤/搜索