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环境,如…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...