1. 什么是 express?
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
使用 Express 可以快速地搭建一个完整功能的网站。
Express 框架核心特性:
可以设置中间件来响应 HTTP 请求。
定义了路由表用于执行不同的 HTTP 请求动作。
可以通过向模板传递参数来动态渲染 HTML 页面。
2. 如何安装 express?
npm install express
以下实例中我们引入了 express 模块,并在客户端发起请求后,响应 {name:‘张三’,age:18,sex:‘男’,id:1} 对象,如果加入动态参数 ‘/1’ 可以返回 {id:1}。也可以使用 post 请求向客户端响应一个文本字符串。
// 1. 导入 express const express = require('express') // 2. 创建 web 服务器 const app = express() // 4. 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容 app.get('/user', (req, res) => { // 调用 express 提供的 res.send() 方法,向客户端响应一个 JSON 对象 res.send({name:'张三',age:18,sex:'男',id:1}) }) app.post('/user', (req, res) => { // 调用 express 提供的 res.send() 方法,向客户端响应一个文本字符串 res.send("请求成功") }) app.get('/', (req, res) => { // 通过 req.query 可以获取到客户端发送过来的 查询参数 // 注意:默认情况下,req.query 是一个空对象 console.log(req.query) res.send(req.query) }) // 注意:这里的 :id 是一个动态的参数 app.get('/user/:id', (req, res) => { // req.params 是动态匹配到的 URL 参数,默认也是一个空对象 // 可以有多个动态参数 '/user/:id/:name' console.log(req.params) res.send(req.params) }) // 3. 启动 web 服务器 app.listen(80, () => { console.log("express server running at http://127.0.0.1") })
4. 使用express.static对外提供静态资源
express.static() 方法,获取 html 页面中的内容,并显示在浏览器中,可以在前面加入一个参数,这样就需要接口加上参数才可以请求到页面信息。app.use() 的作用就是注册全局中间件
const express = require('express') const app = express() // 在这里,调用 express.static() 方法,快速的对外提供静态资源 // 如果有多个,会先查找在前的 app.use('/files',express.static('./files')) app.use(express.static('./clock')) app.listen(80, () => { console.log("express server running at http://127.0.0.1") })
5. 模块化路由
可以把一个页面拆分开,在入口文件引入,请求的接口页面
- 入口页面
const express = require('express') const app = express() // 1. 导入路由模块 const router = require('./05-router') // 2. 注册路由模块 // 添加统一的访问前缀 app.use('/api',router) // 注意:app.use() 的作用就是注册全局中间件 app.listen(80, () => { console.log("express server running at http://127.0.0.1") })
- 接口页面
// 这是路由模块 // 1. 导入 express const express = require('express') // 2. 创建路由对象 const router = express.Router() // 3. 挂载具体的路由 router.get('/user/list', (req, res) => { res.send("Get user list.") }) router.post('/user/add', (req, res) => { res.send("Post user add.") }) // 4. 向外导出路由对象 module.exports = router
6. 定义中间件函数
中间件函数要写在路由之前,路由里可以调用中间件函数里定义的方法
const express = require('express') const app = express() // 定义一个简化的中间件 app.use((req, res, next) => { // 获取到请求到达服务器的时间 const time = Date.now() // 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由 req.startTime = time next() }) app.get('/', (req, res) => { res.send("Home page."+req.startTime) }) app.get('/user', (req, res) => { res.send("User page."+req.startTime) }) app.listen(80, () => { console.log("express server running at http://127.0.0.1") })
7. 局部生效的中间件
只在引入中间件的路由里有效
const express = require('express') const app = express() // 定义一个局部的中间件 const mw1 = (req, res, next) => { console.log("调用了第一个生效的局部中间件") next() } // 定义一个局部的中间件 const mw2 = (req, res, next) => { console.log("调用了第二个生效的局部中间件") next() } // 创建路由 // 局部中间件只在当前有效 // 可以使用多个,有二种方法 mw1,mw2 [mw1,mw2] app.get('/',mw1,mw2, (req, res) => { res.send("Home page.") }) app.get('/user', (req, res) => { res.send("User page.") }) app.listen(80, () => { console.log("express server running at http://127.0.0.1") })
8. 错误级别中间件的使用
可以防止程序的崩溃
const express = require('express') const app = express() // 定义路由 app.get('/', (req, res) => { // 1.1 人为制造错误 throw new Error('服务器内部发生错误') res.send("Home page.") }) // 定义一个错误级别的中间件,捕获整个项目的异常信息,从而防止程序的崩溃 app.use((err,req, res, next) => { console.log("发生了错误" + err.message) res.send('Error' + err.message) }) app.listen(80, () => { console.log("express server running at http://127.0.0.1") })