Express是一个简洁,灵活的node.js Web应用开发框架,是目前最流行的基于Node.js的Web开发框架,它提供一系列强大的功能,这篇文章我们主要介绍express中的路由
- 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
- 路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback...], callback)
, app
是 express
对象的一个实例, METHOD
是一个 HTTP 请求方法, path
是服务器上的路径, callback
是当路由匹配时要执行的函数
下面是路由的一个简单实例:当访问当访问根路径'/'时,返回'hello world'
var express = require('express');var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
res.send('hello world');});
二.请求方法:
Express 定义了如下和 HTTP 请求对应的路由方法: 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
1.使用字符串的路由路径
// 匹配 /about 路径的请求
app.get('/about', function (req, res) {
res.send('about');
});
2.使用字符串模式的路由路径
// 匹配 acd 和 abcd
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.使用正则表达式的路由路径
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
- 可以为请求处理提供多个回调函数,其行为类似 中间件。唯一的区别是这些回调函数有可能调用 next('route')
方法而略过其他路由回调函数。可以利用该机制为路由定义前提条件,如果在现有路径上继续执行没有意义,则可将控制权交给剩下的路径
- 路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合
下面的例子,我们使用函数数组的形式,对根目录'/'的请求,提供四个回掉函数
let cb1 = function(req,res,next){
console.log('1');
next();
};
let cb2 = function(req,res,next){
console.log('2');
next();
};
let cb3 = function(req,res,next){
console.log(3);
next();
};
let cb4 = function(req,res,next){
console.log(4);
res.send('Hello from 4');
};
app.get('/',[cb1,cb2]);
app.get('/',[cb3,cb4]);
// 输出为1,2,3,4
注:
1.next用于执行下一个回掉函数,如果我们将回掉函数中任一next()给去掉,再次请求时,那么会一直处于挂起的状态,这是由于没有执行next函数,那么回掉函数不继续往下执行,这样就导致了没有对应的响应返回客户端
2.next('route') 用于执行下一个相同路由,在上面例子中,如果我们在cb1函数中将next()改为next('route'),那么输出结果为1,3,4,这是由于在执行完cb1之后,会直接跳转至下一个相同个路由,即从cb3开始执行
- 即我们可以在路径中添加会变动的参数,例如我们可以将一个用户id放在url地址上,并通过req.params拿到这个用户id
let express = require('express');
let app = express();
app.get('/user/:id',(req,res)=>{
res.send(req.params.id);
});
app.listen(8080);
如下图,我们可以看到,当请求的地址为localhost:8080/user/4时,可以通过req.params.id拿到当前用的id值
假如我们有一个需要对路径参数做处理的需要,此时我们可以使用app.param来完成,可以理解为处理参数的一个中间件
- 例如我们下面对id这个参数进行的处理:
let express = require('express');
let app = express();
app.param('id',(req,res,next)=>{
console.log(req.params.id);
if (req.params.id === '1'){
next();
}else{
res.sendStatus(404);
}
});
app.get('/user/:id',(req,res)=>{
res.send(`The current user ID is:${req.params.id}`);
});
app.listen(8080);
在实际开发中,我们通常会用到很多路由,此时,如果我们将所有的路由都写在一个js中,即不方便维护,也会看起来比较臃肿,这时,我们可以采用express. Router类,代码如下:
index.js
let express = require('express');
let app = express();
let userRouter = require('./userRouter');
let articleRouter = require('./articleRouter');
app.use('/user',userRouter);
app.use('/article',articleRouter);
app.listen('8080');
userRouter.js
let express = require('express');
let router = express.Router();
router.get('/:name',(req,res)=>{
res.send(`当前用户的姓名为:${req.params.name}`);
});
module.exports = router;
articleRouer.js
let express = require('express');
let router = express.Router();
router.get('/:name',(req,res)=>{
res.send(`当前查看的文章为:${req.params.name}`);
});
module.exports = router;