Node.js - Express框架

1. 介绍
Express 是一个基于 Node.js 的 Web 应用程序框架,主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。
核心概念包括路由,中间件,请求与响应,以及模板引擎支持
2. Express应用的使用
通过npm进行安装express包
npm install express
示例:以下是一个最简单的Express应用程序
const express = require('express');
const app = express();// 路由:处理 GET 请求
app.get('/', (req, res) => {res.send('Hello, Express!');
});// 路由:处理动态参数
app.get('/user/:id', (req, res) => {res.send(`User ID: ${req.params.id}`);
});// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
3. 应用程序对象
Express的核心,负责注册路由和中间件。
使用express()函数创建一个Express应用程序的实例。
const app = express();
4. 路由
Express提供了灵活的路由机制,用于定义应用如何响应客户端的请求
get请求
用于从服务器获取资源(例如网页、数据),请求参数通常附加在URL的查询字符串中,适用于获取数据或无敏感信息的请求
const express = require('express');
const app = express();app.get('/', (req, res) => {res.send('欢迎访问首页!');
});// 带查询参数的 GET 请求
app.get('/search', (req, res) => {const query = req.query; // 获取查询参数res.send(`搜索内容:${query.keyword}`);
});app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));
访问方式:直接在浏览器地址栏输入即可
http://localhost:3000/search?keyword=express
request对象中包含了与HTTP请求相关的信息,例如请求头,URL,参数等信息
| 属性 | 描述 |
| req.params | 包含动态路由中的参数,格式为对象。例如:/user/:id,req.params.id 获取 id 参数 |
| req.query | 包含查询字符串参数,格式为对象。例如:?name=John,req.query.name 获取 name 参数 |
| req.body | 包含 POST 请求的请求体数据,需要中间件解析(如 express.json() 或 express.urlencoded()) |
| req.headers | 包含 HTTP 请求头信息,格式为对象。 |
| req.headers | 包含 HTTP 请求头信息,格式为对象 |
| req.method | HTTP 请求的方法,例如:GET、POST、PUT、DELETE 等 |
| req.url | 请求的完整 URL |
| req.path | 请求的路径部分(不包括查询字符串) |
| req.hostname | 请求的主机名,不包括端口号 |
| req.ip | 客户端的 IP 地址 |
示例:简易的查找返回
const express = require("express")
const file = require("./test.json")
const app = express();app.get('/singer/:id.html',(req,res)=>{let {id} = req.params;let result = file.find(item=>{if (item.id === Number(id)){return true;}})if (!result){res.statusCode=404;renderBlock.end(`<h1>404 NOT FOUND<h1>`);return;}
})
post请求
post请求则是用于向服务器提交数据,例如表单数据,JSON数据,通常会改变服务器上的数据,例如添加,修改或删除资源等操作
<!DOCTYPE html>
<html><head></head><body><form method="post" action="http://127.0.0.1:3000/submit"><textarea placeholder="输入用户名"></textarea><button>登录</button></from></body>
</html>
const express = require('express');
const app = express();app.use(express.json()); // 解析 JSON 格式的请求体
app.use(express.urlencoded({ extended: true })); // 解析 URL 编码的请求体// POST 路由
app.post('/submit', (req, res) => {const body = req.body; // 获取请求体数据res.send(`提交的数据:${JSON.stringify(body)}`);
});app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));
response包含了与HTTP响应相关的方法和属性,用于向客户端返回数据
| 方法 | 描述 |
| res.send(body) | 发送响应数据,可以是字符串,对象,Buffer等 |
| res.json(body) | 发送 JSON 格式的响应 |
| res.status(code) | 设置响应状态码,例如:res.status(404) |
| res.redirect(url) | 重定向到指定 URL |
| res.render(view, data) | 渲染视图模板并发送响应(需要配置模板引擎) |
| res.set(header, value) | 设置响应头 |
| res.cookie(name, value) | 设置 Cookie(需要 cookie-parser 中间件) |
| res.clearCookie(name) | 清除指定的 Cookie |
| res.type(type) | 设置content-type响应头 |
| res.sendFile() | 返回服务器中的文件 |
| res.end() | 结束响应,但不发送数据 |
Response对象常见操作:
跳转响应
app.get('/other',(req,res)=>{res.redirect('http://www.baidu.com')})
下载响应
app.get('/other',(req,res)=>{res.download(__dirname+'/package.json')})
JSON响应
app.get('/other',(req,res)=>{res.json({name:"Ricardo"})})
响应文件内容
用于展示HTML文件等信息
app.get('/other',(req,res)=>{res.sendFile(__dirname+'/test.html')})
4. express中间件
中间件(Middleware) 是 Express 中处理请求和响应的核心机制。它是一个函数,用于处理请求对象 (req)、响应对象 (res),以及在请求-响应周期中执行后续中间件的 next 方法,在路由处理之前或者之后执行。
简单来讲,中间件可以拦截请求、执行某些操作,然后决定是否将请求传递给下一个中间件;它们可以用来处理日志记录、认证、数据解析、错误处理等任务。
中间件的基本形式:
function middleware(req, res, next) {// 中间件逻辑next(); // 调用 next() 将请求传递给下一个中间件
}
4.1 全局中间件
每一个请求到达服务器之后都会执行全局中间件函数,直接绑定到应用对象app上,作用域所有或指定的路由
const express = require("express");
const path = require("path");
const fs = require("fs");const app = express();// 声明中间件函数
function recordMiddleware(req, res, next) {let { url, ip } = req;fs.appendFileSync(path.resolve(__dirname, './access.log'),`${url} ${ip}\r\n`);next(); // 必须调用 next() 将请求传递给后续中间件或路由
}// 使用中间件
app.use(recordMiddleware);app.get('/home', (req, res) => {res.send("Hello express");
});app.get('/admin', (req, res) => {res.send('后台');
});// 处理 404 请求
app.all('*', (req, res) => {res.send("<h1>404 NOT FOUND</h1>");
});// 启动服务器
app.listen(3000, () => {console.log("The server started on port 3000");
});
4.2 专有/路由级中间件
与路由绑定,仅作用于特定路由
function recordMiddleware(req, res, next) {let { url, ip } = req;fs.appendFileSync(path.resolve(__dirname, './access.log'),`${url} ${ip}\r\n`);next(); // 必须调用 next() 将请求传递给后续中间件或路由
}app.get('/home', recordMiddleware,(req, res) => {res.send("Hello express");
});
需要在中间件中声明next才会进一步执行之后回调函数的内容
4.3 静态资源/内置中间件
app.use(express.static(__dirname+'/public'));
根据在public文件夹下的路径即可访问对应的文件
如果public目录下有index.html文件,单独有index.html路由的话,根目录代码'/'书写谁在前显示谁
| 中间件 | 描述 | 安装 |
express.json() | 解析 JSON 格式请求体 | 内置 |
express.urlencoded() | 解析 URL 编码请求体(如表单数据) | 内置 |
express.static() | 提供静态文件服务 | 内置 |
morgan | 记录 HTTP 请求日志 | 需要安装 |
cookie-parser | 解析请求中的 Cookie | 需要安装 |
cors | 处理跨域请求 | 需要安装 |
helmet | 提高应用安全性 | 需要安装 |
body-parser | 解析请求体数据,功能与 express.json() 类似 | 需要安装 |
express-session | 管理会话 | 需要安装 |
示例:中间件获取解析请求参数
首先,准备好我们的表单界面与服务端
<!DOCTYPE html>
<html><head></head><body><form action="http://127.0.0.1:3000/login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><button>登录</button></form></body>
</html>
const express = require("express")const app = express();app.get('/login',(req,res)=>{res.sendFile(__dirname+'/form.html')
})app.post('/login',(req,res)=>{res.send('获取用户的数据')
})app.listen(3000,()=>{console.log('server is running...')
})
name=John&age=25
表单所返回的数据如上述所示,我们需要在服务器端获取上述表单内容,需要使用到中间件
使用中间件解析post请求所获得的数据
const urlencodedParser = express.urlencoded({ extended: false });
使用中间件:
app.post('/login',urlencodedParser,(req,res)=>{console.log(req.body)res.send('获取用户的数据')
})
解析后的数据存放在req中body属性中,解析的内容以对象的形式进行保存
{ name: 'John', age: '25' }
示例:防盗链
防止其他网站对资源进行访问,通过header请求头中refer所实现
app.use((req,res,next)=>{let referer = req.get('referer');if (referer){let url = new URL(referer);let hostname = url.hostname; //获取站点信息if (hostname !== '127.0.0.1'){res.status(404).send('<h1>404 NOT FOUND</h1>')}
}
})
注意事项
1. 中间件顺序很重要:中间件按照定义顺序执行。
2. 确保调用next()如果不调用,后续中间件将不会执行。
5. 路由器(Router)
定义路由器级别的路由,用于为某一组路由逻辑进行模块化管理(即创建“迷你应用”)。
它的作用范围是局部的,绑定在特定的 Router 实例上。
反之使用app.get用于处理直接挂载到整个应用程序上的 HTTP GET 请求,作用范围是全局的,绑定在整个 Express 应用实例上。
const express = require('express');
const app = express();
const router = express.Router();router.get('/about', (req, res) => res.send('关于页面'));
router.get('/contact', (req, res) => res.send('联系我们'));app.use('/info', router); // 将路由器挂载到 /info 路径app.listen(3000);
最终访问路由:
3000/info/about
6. 路由模块化
单独创建一个文件夹用于存储不同作用的路由文件
// ./routes/网站首页.js
const express = require('express')const router = express()router.get('/home',(req,res)=>{res.send("网站首页")
})module.exports = router;
模块化进行声明导出,方便在主文件中进行使用
- 在主文件中配置路由,使用use挂载即可
// ./主文件.jsconst express = require("express");
const router = require('./route/home.js')const app = express();app.use(router);app.all("*",(req,res)=>{res.send("<h1>404 NOT FOUND<h1>")
})app.listen(3000,()=>{console.log("This server has been started")
})
相关文章:
Node.js - Express框架
1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架,主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。 核心概念包括路由,中间件,请求与响应&a…...
AWS Lambda
AWS Lambda 是 Amazon Web Services(AWS)提供的无服务器计算服务,它让开发者能够运行代码而不需要管理服务器或基础设施。AWS Lambda 会自动处理代码的执行、扩展和计费,开发者只需关注编写和部署代码,而无需担心底层硬…...
mysql 如何快速删除表数据
在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...
物联网网关Web服务器--lighttpd服务器部署与应用测试
以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤: 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件,具有以下特点和功能: 特点 轻量级:Lighttpd 在设计上注重轻量级和高效性&a…...
vmware虚拟机配置ubuntu 18.04(20.04)静态IP地址
VMware版本 :VMware Workstation 17 Pro ubuntu版本:ubuntu-18.04.4-desktop-amd64 主机环境 win11 1. 修改 VMware虚拟网络编辑器 打开vmware,点击顶部的“编辑"菜单,打开 ”虚拟化网络编辑器“ 。 选择更改设置&#…...
智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学
智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 文章目录 [智能家居篇]( )一、Win10 VM虚拟机安装 Home Assistant 手把手教学 前言一.下载Vm版本的HomeAsistant安装包 二.打开Vmware选择新建虚拟机1.选择自定义高级2.选择16.x及以上3.选择稍后安装4.根据官网的…...
Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)
Flutter插件在开发Flutter项目的过程中扮演着重要的角色,我们从 https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的,这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…...
Python猜数小游戏
Python 实现的《猜数游戏》 介绍 本文将展示如何使用 Python 编写一个简单的《猜数游戏》。这个游戏将会生成一个1到10之间的随机数,用户有最多三次机会来猜测正确的数字。如果用户猜对了,游戏将结束并显示恭喜信息;如果没有猜对࿰…...
--- 用java实现一个计时器 ---
这里的计时器值得是当线程设定的时间过了之后,自动执行该线程的工作 设计 MyTimer 既然是要在指定的时间之后执行任务,那么传入的参数就应该有run方法(需要执行的任务),time(在多少时间之后执行ÿ…...
OPI4A,目标检测,口罩检测,mnn,YoloX
记得之前,使用了bubbling导师复现的python版yolox,训练了自建的口罩数据集,得到了h5文件,又转换成pb文件,再使用阿里巴巴的MNN,使用它的MNNConvert,转换成mnn文件 最终实现了,在树莓…...
C#与Vue2上传下载Excel文件
1、上传文件流程:先上传文件,上传成功,返回文件名与url,然后再次发起请求保存文件名和url到数据库 前端Vue2代码: 使用element的el-upload组件,action值为后端接收文件接口,headers携带session信…...
Linux(Centos7)安装Mysql/Redis/MinIO
安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务,存储非结构化数据,兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…...
港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...
关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作。根据备忘录,双方将结合各自于科研领域的优势,携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…...
森林网络部署,工业4G路由器实现林区组网远程监控
在广袤无垠的林区,每一片树叶的摇曳、每一丝空气的流动,都关乎着生态的平衡与安宁。林区监控正以强大的力量,为这片绿色家园筑起一道坚固的防线。 工业 4G 路由器作为林区监控组网的守护者,凭借着卓越的通讯性能,突破…...
ASP.NET Core - 配置系统之自定义配置提供程序
ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...
npm、yarn、pnpm包安装器差异性对比
特性npmyarnpnpm发布年份2010 年发布2016 年发布2017 年发布安装速度较慢(旧版本),但自 npm 5 后有所改善较快,尤其是在缓存方面极快,使用硬链接和全局缓存来提高速度包管理模式扁平化依赖,可能会发生重复依…...
正点原子repo放到自己的git服务器
atk-rk3568_android11 导出project-objects对应仓库 .repo/repo/repo list -n > project-object.txt将project-object.txt格式化,并通过gitolite.conf创建对应仓库 atk-rk3568_android11_repo atk-rk3568_android11/RKTools atk-rk3568_android11_repo atk-…...
[MySQL | 二、基本数据类型]
基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串? 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…...
工作记录小点
postman问题 postman 返回404 可以先看看这个模块是否集成到pom文件中 postman 返回200不调debug 请求参数Json有错误请求方式不对Get/Post debug报错连接失败 host文件没copy同事的 2.对应组件的不同服务白名单没添加导致的 host文件刷新 进入 C:\windows\system32\drivers\e…...
在PyCharm中使用Anaconda中的虚拟环境
1、在File菜单中找到Settings 2、Settings中搜索interpreter,找到Python Interpreter,再点击Add 3、选择第一个local interpreter 4、如图: 5、找到anaconda安装位置中的envs文件夹,在里面选择需要添加的python环境,如…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
