官网传送门(opens new window)
基于 Node.js 平台,快速、开放、极简的 Web 开发框架
Express 是用于快速创建服务器的第三方模块。
安装 Express:
npm install express
创建服务器,监听客户端请求,并返回内容:
const express = require('express') // 创建 web 服务器 const app = express() // 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容 app.get('/user', (req, res) => { res.send({ name: 'zs', age: 20, gender: '男' }) }) app.post('/user', (req, res) => { res.send('请求成功') }) app.get('/', (req, res) => { // 通过 req.query 可以获取到客户端发送过来的查询参数 console.log(req.query) res.send(req.query) }) // 这里的 :id 是一个动态的参数 app.get('/user/:ids/:username', (req, res) => { // req.params 是动态匹配到的 URL 参数,默认是一个空对象 console.log(req.params) res.send(req.params) }) app.listen(80, () => { console.log('express server running at http://127.0.0.1') })
app.use(express.static('public')) app.use(express.static('files')) app.use('/bruce', express.static('bruce')) /* 可直接访问 public, files 目录下的静态资源 http://localhost:3000/images/bg.jpg http://localhost:3000/css/style.css http://localhost:3000/js/login.js 通过带有 /bruce 前缀的地址访问 bruce 目录下的文件 http://localhost:8080/bruce/images/logo.png */
创建路由模块:
// router.js const express = require('express') // 创建路由对象 const router = express.Router() // 挂载具体路由 router.get('/user/list', (req, res) => { res.send('Get user list.') }) router.post('/user/add', (req, res) => { res.send('Add new user.') }) // 向外导出路由对象 module.exports = router
注册路由模块:
const express = require('express') const router = require('./router') const app = express() // 注册路由模块,添加访问前缀 app.use('/api', router) app.listen(80, () => { console.log('http://127.0.0.1') })
中间件的作用:
多个中间件之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件中,统一为req或res对象添加自定义属性或方法,供下游的中间件或路由进行使用
中间件注意事项;
const express = require('express') const app = express() // 定义第一个全局中间件 app.use((req, res, next) => { console.log('调用了第1个全局中间件') next() }) // 定义第二个全局中间件 app.use((req, res, next) => { console.log('调用了第2个全局中间件') next() }) app.get('/user', (req, res) => { res.send('User page.') }) app.listen(80, () => { console.log('http://127.0.0.1') })
const express = require('express') const app = express() // 定义中间件函数 const mw1 = (req, res, next) => { console.log('调用了第一个局部生效的中间件') next() } const mw2 = (req, res, next) => { console.log('调用了第二个局部生效的中间件') next() } // 两种定义局部中间件的方式 app.get('/hello', mw2, mw1, (req, res) => res.send('hello page.')) app.get('/about', [mw1, mw2], (req, res) => res.send('about page.')) app.get('/user', (req, res) => res.send('User page.')) app.listen(80, function () { console.log('Express server running at http://127.0.0.1') })
1.应用级别的中间件
2.路由级别的中间件
const app = express() const router = express.Router() router.use(function (req, res, next) { console.log(1) next() }) app.use('/' router)
3.错误级别的中间件
const express = require('express') const app = express() app.get('/', (req, res) => { 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, function () { console.log('Express server running at http://127.0.0.1') })
4.Express 内置中间件
自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 Express 项目的开发效率和体验:
app.use(express.json()) app.use(express.urlencoded({ extended: false })) ` 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性) - `express.json` 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用) - `express.urlencoded` 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用) ```js app.use(express.json()) app.use(express.urlencoded({ extended: false }))
上一篇:别搞目录探测了,OK?