node学习-express路由

一.express路由

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开始执行

五.路由参数:app.param

- 即我们可以在路径中添加会变动的参数,例如我们可以将一个用户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);

六.express.Router

在实际开发中,我们通常会用到很多路由,此时,如果我们将所有的路由都写在一个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;
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭