官方给出的概念:Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。
通俗的理解:Express 的作用和 Node.js 内置的 http 模块类似,是专门用来创建 Web 服务器的。
Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。
Express 的中文官网: Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网
// 1.导入第三方包express
const express = require('express')
// 2. 创建应用
const app = express()
// 3. 监听request请求
// 4.启动并设置端口
app.listen(8001, () => {
console.log('app is runing at http://127.0.0.1');
})
// 3. 监听request请求
app.get('/', (req, res) => {
})
app.post('/', (req, res) => {
})
// 3. 监听request请求
app.get('/', (req, res) => {
res.send('get 请求 返回')
})
app.post('/', (req, res) => {
res.send('post 请求 返回')
})
web开发中所有的代码都是放在服务器端的,客户端在 请求 - 响应 的过程中,代码不会动态的发生变化的文件,我们可以称之为静态资源;html css js 图片 字体等... 都可以称之为静态资源文件。
express 提供了一个非常好用的函数,叫做 express.static(),通过它,我们可以非常方便地创建一个静态资源服务器。
const express = require('express')
const app = express()
// 托管静态资源
app.use(express.static('xtx-pc-client'))
app.listen(80, () => {
console.log('app is running')
})
如上,xtx-pc-client文件夹的静态资源可以对外开放访问了。
在托管的静态资源访问路径之前,挂载路径前缀 :
// 设置静态资源的前缀 位置在第三步
app.use('/study', express.static('xtx-pc-client'))
在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express 中的路由分 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数,格式如下:
客户的请求方式+请求地址与后端的处理函数是映射关系。
app.use(地址,处理函数)
app.post('/', (req, res) => {
})
app.post('/', (req, res) => {
res.send('return post result')
})
为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块。
将路由抽离为单独模块的步骤如下:
1.创建路由模块对应的 .js 文件;
2.调用 express.Router() 函数创建路由对象;
3.向路由对象上挂载具体的路由;
4.使用 module.exports 向外共享路由对象;
5.使用 app.use() 函数注册路由模块。
// 1. 导入express模块
const express = require('express')
// 2. 创建应用
const app = express()
// 3.挂载路由
const router = require('./router.js')
app.use(router)
// 4. 开启服务器并设置端口
app.listen(80, () => {
console.log('app is running')
})
// 3.挂载路由
// 3.1 添加get中间件
app.get('/', (req, res, next) => {
console.log('get ok1')
res.a = 100
res.b = 200
next() // 只有调用next才会进行下一步
})
app.get('/', (req, res) => {
console.log(res.a) // 100
console.log(res.b) // 200
res.send('get ok')
})
// 3.挂载路由
// 3.1 添加一个中间件
const mw1 = (req, res, next) => {
console.log('ok1')
next()
}
// 注册中间件
app.use(mw1)
app.get('/', mw1, (req, res) => {
res.send('get ok')
})
app.post('/', mw1, (req, res) => {
res.send('post ok')
})
1.一定要在路由之前注册中间件;
2.客户端发送过来的请求,可以连续调用多个中间件进行处理;
3.执行完中间件的业务代码之后,不要忘记调用 next() 函数;
4.为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码;
5.连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象。
6.下一个中间件可以获取到上一个中间件绑定的数据。
Express 官方把常见的中间件,分成了 5 大类,分别是:
1.应用级别的中间件;
2.路由级别的中间件;
3.错误级别的中间件;
4.Express 内置的中间件;
5.第三方的中间件。
通过 app.use()函数,绑定到 app 实例上的中间件,叫做应用级别的中间件:
绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别。只不过,应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上。
错误级别的中间件 function 处理函数,必须有 4 个形参,形参顺序从前到后,分别是 (err, req, res, next)。
// 设置错误级别中间件,其放在所有路由的后面
app.use((err, req, res, next) => {
console.log(err.message)
res.send('Error!' + err.message, '请稍后重试')
})