如何看待nodejs路由中间件

  • 中间件定义

    • 中间件是一个特殊的url地址处理函数,它被当作app.use(中间件函数) 的参数或者是某个路由处理函数中使用。
    • 中间件是 express 的最大特色,也是最重要的一个设计。Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。
    • 一个 express 应用,就是由许许多多的中间件来完成的
    •  
  • 中间件的基本使用

    • // 具名函数格式:
      const handler1 = (req, res, next) => {
        console.log(Date.now());
        next();
      }
      app.use(handler1);
      
      // 匿名函数格式:
      app.use((req, res, next) => {
        console.log(Date.now());
        next();
      });
    • 说明: 中间件函数中有三个基本参数, req、res、next
    • req就是请求相关的对象,它和下一个中间件函数中的req对象是一个对象
    • res就是响应相关的对象,它和下一个中间件函数中的res对象是一个对象
    • next:它是一个函数,调用它将会跳出当前的中间件函数,执行后续中间件;如果不调用next,也不执行res.end,则整个请求都会在当前中间件卡住。
    • 多个中间件先后顺序。
    • 注意通过req来附加额外的信息。
    • 如果不用next(),则不会进入下一个中间件。
  • 中间件-匹配路由

    • app.use(中间件)是应用级中间件,所有的请求都能匹配。
    • app.use('/apiname',中间件) 。匹配请求路径是/apiname的请求。
    • app.get('/apiname',中间件) 。匹配get类型并且请求路径是/apiname的请求,就是我们前面说的路由。
    • app.post('/apiname',中间件1,中间件2) 。一个路由中使用多个中间件。 
  • 路由中间件

    • 接口数量较多时,这些接口如果全写在一个文件中,代码不好管理。

    • // server.js express项目的主文件
      const express = require('express');
      
      const app = express();
      // 四个接口的时候还可以,如果是大型项目,100个1000个呢
      app.get('/my/category/list', (req, res) => { res.send('my/category/list') });
      
      app.get('/my/user/userinfo', (req, res) => { res.send('my/user/userinfo') });
      
      app.get('/api/login', (req, res) => { res.send('api/login') });
      
      app.get('/api/reguser', (req, res) => { res.send('api/reguser') });
      
      app.listen(3000, () => {
        console.log(3000);
      });

  • 路由中间件,就可以优化这些.具体思路: 先拆开再合并
  • 先分开在不同的文件夹中
  •  
    合并在server.js中

  •  

    // ./router/my/user.js
    const express = require('express');
    const router = express.Router(); //路由方法
    // 最终的路径为二合1的
    router.get('/userinfo', function(req, res) {
      res.send('userinfo');
    });
    //自定义模块
    module.exports = router;  // 模块导出
    // ./router/api.js
    // 第三个路径不同,两个方法放在一个文件中
    const express = require('express');
    const router = express.Router();
    router.get('/login', function(req, res) {
      res.send('login');
    });
    router.get('/reguser', function(req, res) {
      res.send('reguser');
    });
    module.exports = router;
  • 在server.js主文件合并

  • const express = require('express');
    const app = express();
    // 引入路径地址
    const apiRouter = require('./router/api');
    const categoryRouter = require('./router/my/category');
    const userRouter = require('./router/my/user');
    
    // 路由中间件
    // 最终的路径地址 /api/login  -- /api/reguser
    app.use('/api', apiRouter);
    // 最终的路径地址 /my/category/list
    app.use('/my/category', categoryRouter);
    // 最终的路径地址 /my/user/userinfo
    app.use('/my/user', userRouter);
    
    
    // 最初的地址文件
    //app.get('/my/category/list', (req, res) => { res.send('my/category/list') });
    
    //app.get('/my/user/userinfo', (req, res) => { res.send('my/user/userinfo') });
    
    //app.get('/api/login', (req, res) => { res.send('api/login') });
    
    //app.get('/api/reguser', (req, res) => { res.send('api/reguser') });
    
    app.listen(3000,()=>{
        console.log('express应用在3000端口启动了'); 
    })
  • 图示理解

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值