Express路由

Express路由

一、Express路由简介

路由表示应用程序端点 (URI) 的定义以及响应客户端请求的方式。它包含一个请求方式(methods)、路径(path)和路由匹配时的函数(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”的任何内容。

app.get(/a/, function (req, res) {
    res.send('/a/')
})

这个路由路径将匹配butterfly和dragonfly,但不匹配butterflyman,dragonflyman等。

app.get(/.*fly$/, function (req, res) {
    res.send('/.*fly$/')
})

四、基础路由

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/loginhttp://127.0.0.1:8080/registe都能进入不同路由。

五、动态路由

路线参数

路由参数被命名为URL段,用于捕获URL中在其位置处指定的值。捕获的值将填充到req.params对象中,并将路径中指定的route参数的名称作为其各自的键。

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

要使用路由参数定义路由,只需在路由路径中指定路由参数即可

app.get('/users/:userId/books/:bookId', function (req, res) {
    res.send(req.params)
})

路径参数的名称必须由“文字字符”([A-Za-z0-9_])组成。

由于连字符(-)和点(.)是按字面解释的,因此可以将它们与路由参数一起使用,以实现有用的目的。

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" }

如果希望更好地控制路由参数,匹配确切的字符串,可以在括号(())后面附加一个正则表达式:

Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
由于正则表达式通常是文字字符串的一部分,因此请确保\使用其他反斜杠对所有字符进行转义,例如\d+。

在Express 4.x中,不以常规方式解释正则表达式中的字符。解决方法是使用{0,}代替。这可能会在Express 5中修复。

路由处理程序

你可以提供行为类似于中间件的多个回调函数来处理请求。唯一的例外是这些回调可能会调用next('route')以绕过其余的路由回调。您可以使用此机制在路由上施加先决条件,然后在没有理由继续使用当前路由的情况下将控制权传递给后续路由。

路由处理程序可以采用函数,函数数组或二者组合的形式,如以下示例所示。

单个回调函数可以处理路由

app.get('/example/a', function (req, res) {
    res.send('Hello from A!')
})

多个回调函数可以处理一条路由(确保指定了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!')
})

如果愿意的话,你也可以使用函数数组的方式处理路由

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

如果你希望将采用函数和函数数组相结合的方式处理路由,那么

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!')
})

响应方法

res响应对象方法可以将响应发送到客户端,并终止请求。如果从路由处理程序中未调用这些方法,则客户端请求将被挂起。

方法 作用
res.download() 下载文件
res.end() 结束请求
res.json() 发送JSON响应。
res.jsonp() 发送带有JSONP支持的JSON响应。
res.redirect() 重定向请求。
res.render() 渲染视图模板。
res.send() 发送各种类型的响应。
res.sendFile() 将文件作为八位字节流发送。
res.sendStatus() 设置响应状态代码,并将其字符串表示形式发送为响应正文。

app.route()

您可以使用来为路由路径创建可链接的路由处理程序app.route()。由于路径是在单个位置指定的,因此创建模块化路由非常有帮助,减少冗余和错别字也很有帮助。有关路由的更多信息,请参见: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创建模块化的,可安装的路由处理程序。
一个Router实例是一个完整的中间件和路由系统; 因此,它通常被称为“迷你应用程序”。

以下示例将路由器创建为模块,在其中加载中间件功能,定义一些路由,并将路由器模块安装在主应用程序的路径上。

birds.js在app目录中创建一个名为以下内容的路由器文件:

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

然后,在应用程序中加载路由器模块:

var birds = require('./birds')
// ...
app.use('/birds', birds)

该应用程序现在将能够处理对/birds和的请求/birds/about,以及调用timeLog特定于该路由的中间件功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355