從零開始學習Express二 路由

2022-03-19 11:29:35 字數 3422 閱讀 5806

路由是什麼

以我自己的理解,通俗易懂的講路由就是使用者訪問我們時候的乙個入口。包括兩部分,乙個位址,乙個動作。位址通常以uri形式出現,例如乙個**動作的話包括:get、post、put、delete等等,通常我們訪問乙個**,就是get了乙個**位址。

明白了路由之後,我們就知道了其重要性,沒有路由,使用者也就無從訪問我們的**或者其他服務。下面,來看看express中如何定義路由。

var express = require('express');

接下來,我們就可以在應用上定義各種路由

定義乙個根目錄的get請求:

(req, res, next) );

定義乙個指向關於頁面的get請求:

(req, res, next) );

定義了乙個根目錄的post請求:

(req, res, next) );

});從上面的**可以看出,首先我們用get或者post定義了路由的動作型別,然後通過'/'、'/about'指定了路由的路徑,而後面的function則是我們對路由請求的處理。

這裡的路徑定義細分的話,可以分為3種:

1.純字串路徑,明確指定請求路徑

向上面的**就是最純粹的字串型別,這裡不再重複。

2.帶有萬用字元的字串路徑

常用萬用字元:

?-0個或乙個

+-1個或多個

*-1個或多個

(req, res, next) );

上面的路由可以匹配路徑/abcd和/abc

(req, res, next) );

上面的路由可以匹配路徑/abcd、/abcdd、/abcddd等。

3.正規表示式路徑

(req, res, next) );

上面的路由可以匹配/baidu開始的任何路徑,如/baidu、/baidu/about、/baidu123等等

(req, res, next) );

上面的路由可以匹配/baidu開始並且數字結束的任何路徑,如/baidu1、/baidu123等等,但不匹配/baidu,如果希望匹配/baidu,需要路徑定義修改為/\/baidu[0-9]*$/。

了解了路徑定義之後,我們就可以根據業務需求和系統結構來定義使用者訪問的入口路徑,但這只是入口,當使用者根據我們提供的入口發起請求之後,我們對使用者的請求進行處理並且做出合理的回應才是重點,而這就是上面所說的funciton的工作,我們把它叫做callback(**,即使用者發起請求後,系統會呼叫這個過程進行處理)。

乙個callback就是乙個function,這個function至少有兩個引數,req(請求物件)、res(響應物件)

req物件就是使用者發起請求時所構建的物件,裡面儲存有使用者請求的引數,常用的有兩個:

req.query.引數名稱

get請求時獲取請求引數的方法,如req.query.name

req.body.引數名稱

post請求時獲取請求引數的方法,如req.body.password

res物件是我們反饋給使用者的物件,用於將我們的處理結果傳送給使用者或請求端,常用的方法有:

res.download()

res.end()

終結響應處理流程。

res.json()

傳送乙個 json 格式的響應。

res.jsonp()

傳送乙個支援 jsonp 的 json 格式的響應。

res.redirect()

重定向請求。

res.render()

渲染檢視模板。

res.send()

傳送各種型別的響應。

res.sendfile

以八位位元組流的形式傳送檔案。

res.sendstatus()

設定響應狀態**,並將其以字串形式作為響應體的一部分傳送。

對於乙個路由,可以定義多個callback對請求進行處理,系統會按照次序執行。

(req, res, next) ,

function

(req, res) );

請求/test後,控制台輸出如下:

這裡我們發現第乙個callback有3個引數,多了乙個next,這個很重要。

next負責控制權的傳遞,在每乙個callback的最後,我們都會呼叫next();這樣所有callback都會依次執行。

如果某個callback沒有呼叫next();那後面的callback將沒有機會被呼叫;並且如果前面的callback沒有任何響應請求的動作,客戶請求將被掛起。

如果根據業務需求,當執行到某個callback時,要跳過剩餘的callback處理,可以呼叫next('route');進入下乙個匹配的路由進行處理,如果有的話。

多個callback處理,除了上面的寫法之外,還可以使用函式陣列的方式,如下:

var a = function

(req, res, next)

var b = function

(req, res, next)

var c = function

(req, res, next) ;

(req, res, next) );

至此,我們已經了解了使用express如何定義乙個路由,並且如何控制處理分配到這個路由的請求。

接下來,再補充兩種定義路由的方法。

上面的定義方法,我稱之為以方法為導向,如get或者post等,先定義好乙個方法,再後續定義路徑和處理方法。

第二種路由定義方法:以路徑為導向

(req, res, next() ).post(

function

(req, res, next) );

這種方法,首先確定了請求路徑,然後再定義不同的請求方法,以及各自的**處理函式。

第三種路由定義方法:router模組定義

var express = require('express');

var router =express.router();

router.get('/', function

(req, res, next) );

router.get('/list', function

(req, res, next) );

router.get('/list/:id', function

(req, res, next) );

//最後要匯出這個定義

module.exports = router;

//var blog = require('blog');

//進行掛載

MySql從零開始學習筆記(二)

表的基本操作 1 建立表 create database person 2 修改表名 alter table 表名 rename 新錶名 3 新增列 alter table 表名 add column 列名 varchar 30 4 刪除列 alter table 表名 drop column 列名...

jQuery從零開始 二

1.css類的操作 addclass 向被選元素新增乙個或者多個類 removeclass 刪除被選元素的類 toggleclass 取反 css 獲取或者設定被選元素的css樣式 使用這個方法的時候不需要使用小駝峰,當通過這個方法設定樣式的時候,可以通過傳入乙個物件的形式來設定css樣式 widt...

Git從零開始(二)

前面提交了乙個test1.txt檔案,接下來看看這個檔案接下來的命運。一 繼續修改並提交 在test1.txt中修改後,git status檢視git的狀態,會提示我們檔案test1.txt被修改了,但還沒有提交。但到底修改了什麼呢?接著往下看,git diff test1.txt檢視剛剛修改的內容...