Express 框架

Express 框架:

  • 就是一个web应用开发框架
  • 安装:npm i express
  • 导入:const express = require('express')
  • 创建服务实例:const app = express()
  • 路由定义更简单:
    • app.get
    • app.post
  • 获取请求参数更简单:
    • get:req.query
    • post:req.body
  • express中不再使用res.end方法响应客户端,取而代之的是res.send方法:
    • res.send方法内部也会调用res.end方法
    • 可以自动设置HTTP状态码
    • 可以自动检测响应内容类型并设置上去
    • 自动设置编码格式
    • 直接发送一个JSON对象

中间件:

  • 中间件就是在请求和响应过程中,夹的一层逻辑,可以理解为请求的拦截器

  • 中间件有两部分组成:

    • 定义中间件的方法:由Express提供
    • 中间件处理函数:有程序员编写
  • 中间件可以有多个,先定义的先进入(满足条件的情况下),可以调用next方法交给下一个中间件,直到遇到结束请求的中间件就over

  • 接收所有请求:

    app.use((req, res, next) => {
      // your code...
      next()
    })
    
  • 接收以指定地址开头的请求

    app.use('/xxxpath', (req, res, next) => {
      // your code...
      next()
    })
    
  • 注意:如果不调用next()方法,是不会继续往下面走的

  • 中间件应用:

    • 路由拦截(保护)
    • 网站维护公告
    • 自定义404页面,可以通过res.status(404)方法来设置HTTP状态码
  • 补充说明:res.send和next后,如果还有代码,是会执行的,所以我们一般都会在方法前加个return,阻止后续代码执行

    • 注意:next方法是会等下一个中间件执行完成后才会继续往下执行
  • 错误处理中间件:

    • 错误处理中间件就是一个集中处理错误的地方:

      app.use((err, req, res, next) => {
        // your code..
        res.status(500).send(err.message)
      })
      
    • 同步代码抛错:throw new Error('错误消息')

    • 异步代码抛错:next(new Error('错误消息')),异步代码只能通过这种方式抛出去错误才能被错误处理中间件捕获到

    • 异步函数错误捕获:

      try {
      	await User.find()
      } catch(err) {
      	next(err)
      }
      // -------
      await User.find().catch(err => next(err)) // 推荐用
      
      • 补充说明:try … catch 只能捕获同步错误和异步函数错误,不能捕获其他异步API抛出的错误,比如:setTimeout、fs.readFile(‘some.file’, ‘utf8’, (err, data) => { if (err) { throw err } })

构建模块化路由:

  • 路由是资源路径,比如:/index、/home、/home/index

  • 路由器:是指定义和管理路由的对象

  • 创建路由器:const userRouter = express.Router()

  • 模块化路由:将一类路由定义到一个模块中,方便管理维护

  • 模块化路由范例(用户相关的路由、管理员相关的路由):

    • 用户路由模块,routes/user.js

      const express = require('express')
      
      const userRouter = express.Router()
      
      // /user/index
      userRouter.get('/index', (req, res) => {
        res.send('用户首页')
      })
      
      // /user/reg
      userRouter.get('/reg', (req, res) => {
        res.send('用户注册页')
      })
      
      module.exports = { userRouter }
      
    • 管理员路由模块,routes/admin.js

      const express = require('express')
      
      const adminRouter = express.Router()
      
      // /admin/index
      adminRouter.get('/index', (req, res) => {
        res.send('管理员首页')
      })
      
      // /admin/data-manage
      adminRouter.get('/data-manage', (req, res) => {
        res.send('管理员数据管理页面')
      })
      
      module.exports = { adminRouter }
      
    • 入口文件,app.js:

      const express = require('express')
      
      const app = express()
      
      const { userRouter } = require('./routes/user')
      const { adminRouter } = require('./routes/admin')
      
      // 当拦截到/user 开头请求时,交给 userRouter 处理
      app.use('/user', userRouter)
      
      // 当拦截到/admin 开头请求时,交给 adminRouter 处理
      app.use('/admin', adminRouter)
      
      app.listen(3000)
      console.log('服务启动成功')
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值