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('服务启动成功')
-