Node.js的Express框架使用上手指南
來(lái)源:易賢網(wǎng) 閱讀:763 次 日期:2016-07-20 16:04:36
溫馨提示:易賢網(wǎng)小編為您整理了“Node.js的Express框架使用上手指南”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了Node.js的Express框架使用上手指南,Express可以說(shuō)是目前Node世界中人氣最高的開(kāi)發(fā)框架,需要的朋友可以參考下

Express介紹

npm提供了大量的第三方模塊,其中不乏許多Web框架,比如我們本章節(jié)要講述的一個(gè)輕量級(jí)的Web框架 ——— Express。

Express是一個(gè)簡(jiǎn)潔、靈活的node.js Web應(yīng)用開(kāi)發(fā)框架, 它提供一系列強(qiáng)大的功能,比如:模板解析、靜態(tài)文件服務(wù)、中間件、路由控制等等,并且還可以使用插件或整合其他模塊來(lái)幫助你創(chuàng)建各種 Web和移動(dòng)設(shè)備應(yīng)用,是目前最流行的基于Node.js的Web開(kāi)發(fā)框架,并且支持Ejs、jade等多種模板,可以快速地搭建一個(gè)具有完整功能的網(wǎng)站。

好,下面我們就開(kāi)始吧!

1. NPM安裝

npm install express

2. 獲取、引用

var express = require('express');

var app = express();

通過(guò)變量“app”我們就可以調(diào)用express的各種方法了,好戲剛剛開(kāi)始,繼續(xù)加油吧!

創(chuàng)建應(yīng)用

認(rèn)識(shí)了Express框架,我們開(kāi)始創(chuàng)建我們的第一個(gè)express應(yīng)用。

在我們的默認(rèn)項(xiàng)目主文件app.js添加如下內(nèi)容:

var express = require('express');

var app = express();

app.get('/', function (request, response) {

  response.send('Hello World!');

});

app.listen(80);

說(shuō)明:在后面課程學(xué)習(xí)中,我們會(huì)統(tǒng)一使用80端口用于監(jiān)聽(tīng)請(qǐng)求。

添加完畢之后,通過(guò)右側(cè)欄的“測(cè)試地址”來(lái)查看瀏覽器內(nèi)容,當(dāng)看到“Hello World!”內(nèi)容就表明一個(gè)簡(jiǎn)單的express應(yīng)用已經(jīng)創(chuàng)建成功了。

get請(qǐng)求

前面我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的express應(yīng)用,下面我們就開(kāi)始具體講述它的具體實(shí)現(xiàn),首先我們先來(lái)學(xué)習(xí)Express的常用方法。

get方法 —— 根據(jù)請(qǐng)求路徑來(lái)處理客戶端發(fā)出的GET請(qǐng)求。

格式:

app.get(path,function(request, response));

path為請(qǐng)求的路徑,第二個(gè)參數(shù)為處理請(qǐng)求的回調(diào)函數(shù),有兩個(gè)參數(shù)分別是request和response,代表請(qǐng)求信息和響應(yīng)信息。

如下示例:

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頁(yè)面路徑、根路徑和所有路徑的處理方法。并且在回調(diào)函數(shù)內(nèi)部,使用HTTP回應(yīng)的send方法,表示向?yàn)g覽器發(fā)送一個(gè)字符串。

參照以上代碼,試試自己設(shè)定一個(gè)get請(qǐng)求路徑,然后瀏覽器訪問(wèn)該地址是否可以請(qǐng)求成功。

Middleware<中間件>

1.什么是中間件?

中間件(middleware)就是處理HTTP請(qǐng)求的函數(shù),用來(lái)完成各種特定的任務(wù),比如檢查用戶是否登錄、分析數(shù)據(jù)、以及其他在需要最終將數(shù)據(jù)發(fā)送給用戶之前完成的任務(wù)。 它最大的特點(diǎn)就是,一個(gè)中間件處理完,可以把相應(yīng)數(shù)據(jù)再傳遞給下一個(gè)中間件。

2.一個(gè)不進(jìn)行任何操作、只傳遞request對(duì)象的中間件,大概是這樣:

function Middleware(request, response, next) {

  next();

}

上面代碼的next為中間件的回調(diào)函數(shù)。如果它帶有參數(shù),則代表拋出一個(gè)錯(cuò)誤,參數(shù)為錯(cuò)誤文本。

function Middleware(request, response, next) {

  next('出錯(cuò)了!');

}

拋出錯(cuò)誤以后,后面的中間件將不再執(zhí)行,直到發(fā)現(xiàn)一個(gè)錯(cuò)誤處理函數(shù)為止。如果沒(méi)有調(diào)用next方法,后面注冊(cè)的函數(shù)也是不會(huì)執(zhí)行的。

all函數(shù)的基本用法

和get函數(shù)不同app.all()函數(shù)可以匹配所有的HTTP動(dòng)詞,也就是說(shuō)它可以過(guò)濾所有路徑的請(qǐng)求,如果使用all函數(shù)定義中間件,那么就相當(dāng)于所有請(qǐng)求都必須先通過(guò)此該中間件。

格式:

app.all(path,function(request, response));

如下所示,我們使用all函數(shù)在請(qǐng)求之前設(shè)置響應(yīng)頭屬性。

var express = require("express");

var app = express();

app.all("*", function(request, response, next) {

  response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //設(shè)置響應(yīng)頭屬性值

next();

});

app.get("/", function(request, response) {

  response.end("歡迎來(lái)到首頁(yè)!");

});

app.get("/about", function(request, response) {

  response.end("歡迎來(lái)到about頁(yè)面!");

});

app.get("*", function(request, response) {

  response.end("404 - 未找到!");

});

app.listen(80);

上面代碼參數(shù)中的“*”表示對(duì)所有路徑有效,這個(gè)方法在給特定前綴路徑或者任意路徑上處理時(shí)會(huì)特別有用,不管我們請(qǐng)求任何路徑都會(huì)事先經(jīng)過(guò)all函數(shù)。

如果所示,如果我們跳過(guò)all函數(shù)又會(huì)怎么樣呢,自己動(dòng)手試一試?

use基本用法1

use是express調(diào)用中間件的方法,它返回一個(gè)函數(shù)。

格式:

app.use([path], function(request, response, next){});

//可選參數(shù)path默認(rèn)為"/"。

1. 使用中間件

app.use(express.static(path.join(__dirname, '/')));

如上呢,我們就使用use函數(shù)調(diào)用express中間件設(shè)定了靜態(tài)文件目錄的訪問(wèn)路徑(這里假設(shè)為根路徑)。

2. 如何連續(xù)調(diào)用兩個(gè)中間件呢,如下示例:

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('示例:連續(xù)調(diào)用兩個(gè)中間件');

});

app.listen(80);

回調(diào)函數(shù)的next參數(shù),表示接受其他中間件的調(diào)用,函數(shù)體中的next(),表示將請(qǐng)求數(shù)據(jù)傳遞給下一個(gè)中間件。

上面代碼先調(diào)用第一個(gè)中間件,在控制臺(tái)輸出一行信息,然后通過(guò)next(),調(diào)用第二個(gè)中間件,輸出HTTP回應(yīng)。由于第二個(gè)中間件沒(méi)有調(diào)用next方法,所以req對(duì)象就不再向后傳遞了。

use基本用法2

use方法不僅可以調(diào)用中間件,還可以根據(jù)請(qǐng)求的網(wǎng)址,返回不同的網(wǎng)頁(yè)內(nèi)容,如下示例:

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);

上面代碼通過(guò)request.url屬性,判斷請(qǐng)求的網(wǎng)址,從而返回不同的內(nèi)容。

回調(diào)函數(shù)

Express回調(diào)函數(shù)有兩個(gè)參數(shù),分別是request(簡(jiǎn)稱req)和response(簡(jiǎn)稱res),request代表客戶端發(fā)來(lái)的HTTP請(qǐng)求,request代表發(fā)向客戶端的HTTP回應(yīng),這兩個(gè)參數(shù)都是對(duì)象。示例如下:

function(req, res) {

});

在后面的學(xué)習(xí)中,我們會(huì)經(jīng)常和它打交道,牢牢記住它的格式吧!

獲取主機(jī)名、路徑名

今天我們就先來(lái)學(xué)習(xí)如何使用req對(duì)象來(lái)處理客戶端發(fā)來(lái)的HTTP請(qǐng)求。

req.host返回請(qǐng)求頭里取的主機(jī)名(不包含端口號(hào))。

req.path返回請(qǐng)求的URL的路徑名。

如下示例:

var express = require('express');

var app = express();

app.get("*", function(req, res) {

  console.log(req.path);

  res.send("req.host獲取主機(jī)名,req.path獲取請(qǐng)求路徑名!");

});

app.listen(80);

試一試在瀏覽器中輸入任意一個(gè)請(qǐng)求路徑,通過(guò)req查看主機(jī)名或請(qǐng)求路徑。

query基本用法

query是一個(gè)可獲取客戶端get請(qǐng)求路徑參數(shù)的對(duì)象屬性,包含著被解析過(guò)的請(qǐng)求參數(shù)對(duì)象,默認(rèn)為{}。

var express = require('express');

var app = express();

app.get("*", function(req, res) {

  console.log(req.query.參數(shù)名);

  res.send("測(cè)試query屬性!");

});

app.listen(80);

通過(guò)req.query獲取get請(qǐng)求路徑的對(duì)象參數(shù)值。

格式:req.query.參數(shù)名;請(qǐng)求路徑如下示例:

例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請(qǐng)求一個(gè)帶參數(shù)路徑,使用“req.query.參數(shù)名”方法獲取請(qǐng)求參數(shù)值。

param基本用法

和屬性query一樣,通過(guò)req.param我們也可以獲取被解析過(guò)的請(qǐng)求參數(shù)對(duì)象的值。

格式:req.param("參數(shù)名");請(qǐng)求路徑如下示例:

例1: 獲取請(qǐng)求根路徑的參數(shù)值,如/?n=Lenka,方法如下:

var express = require('express');

var app = express();

app.get("/", function(req, res) {

  console.log(req.param("n")); //Lenka

  res.send("使用req.param屬性獲取請(qǐng)求根路徑的參數(shù)對(duì)象值!");

});

app.listen(80);

例2:我們也可以獲取具有相應(yīng)路由規(guī)則的請(qǐng)求對(duì)象,假設(shè)路由規(guī)則為 /user/:name/,請(qǐng)求路徑/user/mike,如下:

app.get("/user/:name/", function(req, res) {

  console.log(req.param("name")); //mike

  res.send("使用req.param屬性獲取具有路由規(guī)則的參數(shù)對(duì)象值!");

});

PS:所謂“路由”,就是指為不同的訪問(wèn)路徑,指定不同的處理方法。

看了上面的示例,試一試使用req.param屬性解析一個(gè)請(qǐng)求路徑對(duì)象,并獲取請(qǐng)求參數(shù)值。

params基本用法

和param相似,但params是一個(gè)可以解析包含著有復(fù)雜命名路由規(guī)則的請(qǐng)求對(duì)象的屬性。

格式:req.params.參數(shù)名;

例1. 如上課時(shí)請(qǐng)求根路徑的例子,我們就可以這樣獲取,如下:

var express = require('express');

var app = express();

app.get("/user/:name/", function(req, res) {

  console.log(req.params.name); //mike

  res.send("使用req.params屬性獲取具有路由規(guī)則的參數(shù)對(duì)象值!");

});

app.listen(80);

查看運(yùn)行結(jié)果,和param屬性功能是一樣的,同樣獲取name參數(shù)值。

例2:當(dāng)然我們也可以請(qǐng)求復(fù)雜的路由規(guī)則,如/user/:name/:id,假設(shè)請(qǐng)求地址為:/user/mike/123,如下:

app.get("/user/:name/:id", function(req, res) {

  console.log(req.params.id); //"123"

  res.send("使用req.params屬性復(fù)雜路由規(guī)則的參數(shù)對(duì)象值!");

});

對(duì)于請(qǐng)求地址具有路由規(guī)則的路徑來(lái)說(shuō),屬性params比param屬性是不是又強(qiáng)大了那么一點(diǎn)點(diǎn)呢!

send基本用法

send()方法向?yàn)g覽器發(fā)送一個(gè)響應(yīng)信息,并可以智能處理不同類型的數(shù)據(jù)。格式如下: res.send([body|status], [body]);

1.當(dāng)參數(shù)為一個(gè)String時(shí),Content-Type默認(rèn)設(shè)置為"text/html"。

res.send('Hello World'); //Hello World

2.當(dāng)參數(shù)為Array或Object時(shí),Express會(huì)返回一個(gè)JSON。

res.send({ user: 'tobi' }); //{"user":"tobi"}

res.send([1,2,3]); //[1,2,3]

3.當(dāng)參數(shù)為一個(gè)Number時(shí),并且沒(méi)有上面提到的任何一條在響應(yīng)體里,Express會(huì)幫你設(shè)置一個(gè)響應(yīng)體,比如:200會(huì)返回字符"OK"。

res.send(200); // OK

res.send(404); // Not Found

res.send(500); // Internal Server Error

send方法在輸出響應(yīng)時(shí)會(huì)自動(dòng)進(jìn)行一些設(shè)置,比如HEAD信息、HTTP緩存支持等等。

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:Node.js的Express框架使用上手指南
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)