Express路由
一魂仍、Express路由簡介
路由表示應(yīng)用程序端點 (URI) 的定義以及響應(yīng)客戶端請求的方式嗡害。它包含一個請求方式(methods)奴拦、路徑(path)和路由匹配時的函數(shù)(callback);
app.methods(path, callback);
二、Express路由方法
Express方法源于 HTTP 方法之一垃僚,附加到 express 類的實例集绰。它可請求的方法包括:
get、post谆棺、put栽燕、head罕袋、delete、options碍岔、trace浴讯、copy、lock蔼啦、mkcol榆纽、move、purge捏肢、propfind奈籽、proppatch、unlock鸵赫、report衣屏、mkactivity、checkout辩棒、merge勾拉、m-search、notify盗温、subscribe、unsubscribe成肘、patch卖局、search 和 connect。
三双霍、路徑
Express路徑包含三種表達形式砚偶,分別為字符串、字符串模式洒闸、正則表達式
1.字符串路徑
app.get("/login",function(req,res){
res.send("hello my name is express");
})
此路徑地址將與/login匹配
2.字符串模式路徑
此路由路徑將與acd或abcd相匹配
app.get('/ab?cd', function (req, res) {
res.send('字符串模式')
})
這個路由的路徑將會匹配abcd染坯,abbcd,abbbcd丘逸,等等单鹿。
app.get('/ab+cd', function (req, res) {
res.send('ab+cd')
})
這個路由的路徑將會匹配abcd,abxcd深纲,abRANDOMcd仲锄,ab123cd,等湃鹊。
app.get('/ab*cd', function (req, res) {
res.send('ab*cd')
})
這個路由路徑將與/abe和相匹配/abcde儒喊。
app.get('/ab(cd)?e', function (req, res) {
res.send('ab(cd)?e')
})
3.正則表達式路徑
這個路由路徑將匹配其中帶有“ a”的任何內(nèi)容。
app.get(/a/, function (req, res) {
res.send('/a/')
})
這個路由路徑將匹配butterfly和dragonfly币呵,但不匹配butterflyman怀愧,dragonflyman等。
app.get(/.*fly$/, function (req, res) {
res.send('/.*fly$/')
})
四、基礎(chǔ)路由
const express = require("express");
var app = express();
app.get("/",function(req,res){
res.send(<h1>主頁</h1>);
});
app.get("/login",function(req,res){
res.send(“登錄頁面”);
});
app.get("/registe",function(req,res){
res.send(“注冊頁面”);
});
app.listen(8080);
輸入http://127.0.0.1:8080/login和http://127.0.0.1:8080/registe都能進入不同路由芯义。
五哈垢、動態(tài)路由
路線參數(shù)
路由參數(shù)被命名為URL段,用于捕獲URL中在其位置處指定的值毕贼。捕獲的值將填充到req.params對象中温赔,并將路徑中指定的route參數(shù)的名稱作為其各自的鍵。
Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }
要使用路由參數(shù)定義路由鬼癣,只需在路由路徑中指定路由參數(shù)即可
app.get('/users/:userId/books/:bookId', function (req, res) {
res.send(req.params)
})
路徑參數(shù)的名稱必須由“文字字符”([A-Za-z0-9_])組成陶贼。
由于連字符(-)和點(.)是按字面解釋的,因此可以將它們與路由參數(shù)一起使用待秃,以實現(xiàn)有用的目的拜秧。
Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
Route path: /plantae/:genus.:species
Request URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }
如果希望更好地控制路由參數(shù),匹配確切的字符串章郁,可以在括號(())后面附加一個正則表達式:
Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
由于正則表達式通常是文字字符串的一部分枉氮,因此請確保\使用其他反斜杠對所有字符進行轉(zhuǎn)義,例如\d+暖庄。
在Express 4.x中聊替,不以常規(guī)方式解釋正則表達式中的字符。解決方法是使用{0,}代替培廓。這可能會在Express 5中修復(fù)惹悄。
路由處理程序
你可以提供行為類似于中間件的多個回調(diào)函數(shù)來處理請求。唯一的例外是這些回調(diào)可能會調(diào)用next('route')以繞過其余的路由回調(diào)肩钠。您可以使用此機制在路由上施加先決條件泣港,然后在沒有理由繼續(xù)使用當(dāng)前路由的情況下將控制權(quán)傳遞給后續(xù)路由。
路由處理程序可以采用函數(shù)价匠,函數(shù)數(shù)組或二者組合的形式当纱,如以下示例所示。
單個回調(diào)函數(shù)可以處理路由
app.get('/example/a', function (req, res) {
res.send('Hello from A!')
})
多個回調(diào)函數(shù)可以處理一條路由(確保指定了next對象)
app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from B!')
})
如果愿意的話踩窖,你也可以使用函數(shù)數(shù)組的方式處理路由
var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
var cb2 = function (req, res) {
res.send('Hello from C!')
}
app.get('/example/c', [cb0, cb1, cb2])
如果你希望將采用函數(shù)和函數(shù)數(shù)組相結(jié)合的方式處理路由坡氯,那么
var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from D!')
})
響應(yīng)方法
res響應(yīng)對象方法可以將響應(yīng)發(fā)送到客戶端,并終止請求洋腮。如果從路由處理程序中未調(diào)用這些方法廉沮,則客戶端請求將被掛起。
方法 | 作用 |
---|---|
res.download() | 下載文件 |
res.end() | 結(jié)束請求 |
res.json() | 發(fā)送JSON響應(yīng)徐矩。 |
res.jsonp() | 發(fā)送帶有JSONP支持的JSON響應(yīng)滞时。 |
res.redirect() | 重定向請求。 |
res.render() | 渲染視圖模板滤灯。 |
res.send() | 發(fā)送各種類型的響應(yīng)坪稽。 |
res.sendFile() | 將文件作為八位字節(jié)流發(fā)送曼玩。 |
res.sendStatus() | 設(shè)置響應(yīng)狀態(tài)代碼,并將其字符串表示形式發(fā)送為響應(yīng)正文窒百。 |
app.route()
您可以使用來為路由路徑創(chuàng)建可鏈接的路由處理程序app.route()黍判。由于路徑是在單個位置指定的,因此創(chuàng)建模塊化路由非常有幫助篙梢,減少冗余和錯別字也很有幫助顷帖。有關(guān)路由的更多信息,請參見:Router()文檔渤滞。
這是使用定義的鏈式路由處理程序的示例app.route()贬墩。
app.route('/book')
.get(function (req, res) {
res.send('Get a random book')
})
.post(function (req, res) {
res.send('Add a book')
})
.put(function (req, res) {
res.send('Update the book')
})
快速路由器
使用express.Router創(chuàng)建模塊化的,可安裝的路由處理程序妄呕。
一個Router實例是一個完整的中間件和路由系統(tǒng); 因此陶舞,它通常被稱為“迷你應(yīng)用程序”。
以下示例將路由器創(chuàng)建為模塊绪励,在其中加載中間件功能肿孵,定義一些路由,并將路由器模塊安裝在主應(yīng)用程序的路徑上疏魏。
birds.js在app目錄中創(chuàng)建一個名為以下內(nèi)容的路由器文件:
var express = require('express')
var router = express.Router()
// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
console.log('Time: ', Date.now())
next()
})
// define the home page route
router.get('/', function (req, res) {
res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
res.send('About birds')
})
module.exports = router
然后停做,在應(yīng)用程序中加載路由器模塊:
var birds = require('./birds')
// ...
app.use('/birds', birds)
該應(yīng)用程序現(xiàn)在將能夠處理對/birds和的請求/birds/about,以及調(diào)用timeLog特定于該路由的中間件功能大莫。