Express框架介绍—node.js

Express—Node.js

官网传送门(opens new window)

基于 Node.js 平台,快速、开放、极简的 Web 开发框架

Express 是用于快速创建服务器的第三方模块。

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')
})

托管静态资源

  • 通过 express.static() 方法可创建静态资源服务器,向外开放访问静态资源。
  • Express 在指定的静态目录中查找文件,并对外提供资源的访问路径,存放静态文件的目录名不会出现在 URL 中
  • 访问静态资源时,会根据托管顺序查找文件
  • 可为静态资源访问路径添加前缀
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
*/

Express 路由

创建路由模块:

// 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')
})

Express 中间件

  • 中间件是指流程的中间处理环节
  • 服务器收到请求后,可先调用中间件进行预处理
  • 中间件是一个函数,包含 req, res, next 三个参数,next() 参数把流转关系交给下一个中间件或路由

中间件的作用:

多个中间件之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件中,统一为req或res对象添加自定义属性或方法,供下游的中间件或路由进行使用

中间件注意事项;

  • 在注册路由之前注册中间件(错误级别中间件除外)
  • 中间件可连续调用多个
  • 别忘记调用 next() 函数
  • next() 函数后别写代码
  • 多个中间件共享 reqres对象

image-20221119161950670

全局中间件

  • 通过 app.use() 定义的中间件为全局中间件
  • 这时访问其他接口都会调用该中间件
  • 定义多个全局中间件时,会按照编写顺序从前往后执行
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.应用级别的中间件

  • 通过 app.use()app.get()app.post() ,绑定到 app 实例上的中间件

2.路由级别的中间件

  • 绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。用法和应用级别中间件没有区别。应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上。
const app = express()
const router = express.Router()router.use(function (req, res, next) {console.log(1)next()
})app.use('/' router)

3.错误级别的中间件

  • 用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题
  • 错误级别中间件的处理函数中,必须有 4 个形参,形参顺序从前到后分别是 (err, req, res, next)
  • 错误级别的中间件必须注册在所有路由之后
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 项目的开发效率和体验:

  • express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)
  • express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
  • express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
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 }))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456698.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文:pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Shen Li 注意 在github中查看并编辑本教程。 先决条件: PyTorc…

Java13常用类3:Date类

4. Date类1:jdk1.8 之前 jdk1.8 之前的API: System类的currentTimeMillis():获取当前系统时间两个Date类: SimpleDateFormate类:用于格式化、解析Calendar日历类的使用:抽象类 4.1 两个Date类 时间戳&…

《动手学深度学习(PyTorch版)》笔记6.1

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中,for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码,从而实现各种复杂的功能。无论你是初学者还是资深开发者,掌握for循环的用法都是必不可少的。在本文中,我们…

第三百一十回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容,本章回中将介绍如何添加输入框默认值.闲话休提,让我们一起Talk Flutter吧。 1.…

【C++从0到王者】第四十一站:特殊类的设计

文章目录 一、设计一个类,不能被拷贝1.C98方法2.C11方法 二、设计一个类,只能在堆上创建对象1.析构函数私有化2.构造函数私有化 三、请设计一个类,只能在栈上创建对象四、设计一个类不能被继承1.C98方式2.C11方式 五、设计一个类,…

【JS逆向学习】今日头条

逆向目标 目标网页:https://www.toutiao.com/?wid1707099375036目标接口:https://www.toutiao.com/api/pc/list/feed目标参数:_signature 逆向过程 老规矩先观察网络请求,过滤XHR请求观察加密参数,发现Payload的_s…

c#cad 创建-直线(五)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是用于在AutoCAD中创建一条直线。首先获取当前活动文档和数据库的引用,然后创建一个编辑器对象用于提示用户输入。接下来,在一个事务中获取模型空间的块表记录,并定义直线的长度…

图灵之旅--二叉树堆排序

目录 树型结构概念树的表示形式 二叉树概念特殊的二叉树二叉树性质二叉树的存储二叉树的遍历前中后序遍历 优先级队列(堆)概念 优先级队列的模拟实现堆的性质概念堆的存储方式堆的创建 堆常用接口介绍PriorityQueue的特性PriorityQueue常用接口介绍优先级队列的构造插入/删除/获…

没有联合和枚举 , C语言怎么能在江湖混 ?

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

QT:界面上重写鼠标事件(画框,鼠标更改)

前言 接上一篇的rtsp播放器,有需要在播放界面手动跟踪,就需要在播放界面绘制矩形框,并把当前鼠标绘制区域的宽高坐标进行换算发送给3559,做进一步处理。绘制矩形框共分为两种,第一种是左键拖动绘制,第二种是…

Z函数的原理和应用:以Python为例

Z函数 也就是,它想找前缀和以s[i]开头的后缀的LCP 思想 维护一个右端点最右的z-box 结合z[i - l]的结果和朴素算法进行优化 Z函数Python模版 def sumScores(self, s: str) -> int:n len(s)z [0] * nl r 0 # 右端点最右的z-boxfor i in range(1, n):if i &…