路由是什麼
以我自己的理解,通俗易懂的講路由就是使用者訪問我們時候的乙個入口。包括兩部分,乙個位址,乙個動作。位址通常以uri形式出現,例如乙個**動作的話包括:get、post、put、delete等等,通常我們訪問乙個**,就是get了乙個**位址。
明白了路由之後,我們就知道了其重要性,沒有路由,使用者也就無從訪問我們的**或者其他服務。下面,來看看express中如何定義路由。
var express = require('express');定義乙個指向關於頁面的get請求:接下來,我們就可以在應用上定義各種路由
定義乙個根目錄的get請求:
(req, res, next) );
(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至此,我們已經了解了使用express如何定義乙個路由,並且如何控制處理分配到這個路由的請求。(req, res, next)
var b = function
(req, res, next)
var c = function
(req, res, next) ;
(req, res, next) );
接下來,再補充兩種定義路由的方法。
上面的定義方法,我稱之為以方法為導向,如get或者post等,先定義好乙個方法,再後續定義路徑和處理方法。
第二種路由定義方法:以路徑為導向
(req, res, next() ).post(
function
(req, res, next) );
這種方法,首先確定了請求路徑,然後再定義不同的請求方法,以及各自的**處理函式。
第三種路由定義方法:router模組定義
var express = require('express');//var blog = require('blog');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;
//進行掛載
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檢視剛剛修改的內容...