当前位置: 首页 > news >正文

Node.js - Express框架

1. 介绍

Express 是一个基于 Node.jsWeb 应用程序框架,主要用于快速、简便地构建 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/:idreq.params.id 获取 id 参数
req.query包含查询字符串参数,格式为对象。例如:?name=Johnreq.query.name 获取 name 参数
req.body包含 POST 请求的请求体数据,需要中间件解析(如 express.json()express.urlencoded()
req.headers包含 HTTP 请求头信息,格式为对象。
req.headers包含 HTTP 请求头信息,格式为对象
req.methodHTTP 请求的方法,例如:GETPOSTPUTDELETE
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 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…...

AWS Lambda

AWS Lambda 是 Amazon Web Services&#xff08;AWS&#xff09;提供的无服务器计算服务&#xff0c;它让开发者能够运行代码而不需要管理服务器或基础设施。AWS Lambda 会自动处理代码的执行、扩展和计费&#xff0c;开发者只需关注编写和部署代码&#xff0c;而无需担心底层硬…...

mysql 如何快速删除表数据

在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…...

vmware虚拟机配置ubuntu 18.04(20.04)静态IP地址

VMware版本 &#xff1a;VMware Workstation 17 Pro ubuntu版本&#xff1a;ubuntu-18.04.4-desktop-amd64 主机环境 win11 1. 修改 VMware虚拟网络编辑器 打开vmware&#xff0c;点击顶部的“编辑"菜单&#xff0c;打开 ”虚拟化网络编辑器“ 。 选择更改设置&#…...

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 文章目录 [智能家居篇]( )一、Win10 VM虚拟机安装 Home Assistant 手把手教学 前言一.下载Vm版本的HomeAsistant安装包 二.打开Vmware选择新建虚拟机1.选择自定义高级2.选择16.x及以上3.选择稍后安装4.根据官网的…...

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…...

Python猜数小游戏

Python 实现的《猜数游戏》 介绍 本文将展示如何使用 Python 编写一个简单的《猜数游戏》。这个游戏将会生成一个1到10之间的随机数&#xff0c;用户有最多三次机会来猜测正确的数字。如果用户猜对了&#xff0c;游戏将结束并显示恭喜信息&#xff1b;如果没有猜对&#xff0…...

--- 用java实现一个计时器 ---

这里的计时器值得是当线程设定的时间过了之后&#xff0c;自动执行该线程的工作 设计 MyTimer 既然是要在指定的时间之后执行任务&#xff0c;那么传入的参数就应该有run方法&#xff08;需要执行的任务&#xff09;&#xff0c;time&#xff08;在多少时间之后执行&#xff…...

OPI4A,目标检测,口罩检测,mnn,YoloX

记得之前&#xff0c;使用了bubbling导师复现的python版yolox&#xff0c;训练了自建的口罩数据集&#xff0c;得到了h5文件&#xff0c;又转换成pb文件&#xff0c;再使用阿里巴巴的MNN&#xff0c;使用它的MNNConvert&#xff0c;转换成mnn文件 最终实现了&#xff0c;在树莓…...

C#与Vue2上传下载Excel文件

1、上传文件流程&#xff1a;先上传文件&#xff0c;上传成功&#xff0c;返回文件名与url&#xff0c;然后再次发起请求保存文件名和url到数据库 前端Vue2代码&#xff1a; 使用element的el-upload组件&#xff0c;action值为后端接收文件接口&#xff0c;headers携带session信…...

Linux(Centos7)安装Mysql/Redis/MinIO

安装Mysql 安装Redis 搜索Redis最先版本所在的在线安装yum库 查看以上两个组件是否是开机自启 安装MinIO 开源的对象存储服务&#xff0c;存储非结构化数据&#xff0c;兼容亚马逊S3协议。 minio --help #查询命令帮助minio --server --help #查询--server帮助minio serve…...

港科夜闻 | 香港科大与微软亚洲研究院签署战略合作备忘录,推动医学健康教育及科研协作...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与微软亚洲研究院签署战略合作备忘录&#xff0c;推动医学健康教育及科研协作。根据备忘录&#xff0c;双方将结合各自于科研领域的优势&#xff0c;携手推动医学健康领域的交流与合作。合作方向将涵盖人才培训、…...

森林网络部署,工业4G路由器实现林区组网远程监控

在广袤无垠的林区&#xff0c;每一片树叶的摇曳、每一丝空气的流动&#xff0c;都关乎着生态的平衡与安宁。林区监控正以强大的力量&#xff0c;为这片绿色家园筑起一道坚固的防线。 工业 4G 路由器作为林区监控组网的守护者&#xff0c;凭借着卓越的通讯性能&#xff0c;突破…...

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...

npm、yarn、pnpm包安装器差异性对比

特性npmyarnpnpm发布年份2010 年发布2016 年发布2017 年发布安装速度较慢&#xff08;旧版本&#xff09;&#xff0c;但自 npm 5 后有所改善较快&#xff0c;尤其是在缓存方面极快&#xff0c;使用硬链接和全局缓存来提高速度包管理模式扁平化依赖&#xff0c;可能会发生重复依…...

正点原子repo放到自己的git服务器

atk-rk3568_android11 导出project-objects对应仓库 .repo/repo/repo list -n > project-object.txt将project-object.txt格式化&#xff0c;并通过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如何选择定长或变长字符串&#xff1f; 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&#xff0c;找到Python Interpreter&#xff0c;再点击Add 3、选择第一个local interpreter 4、如图&#xff1a; 5、找到anaconda安装位置中的envs文件夹&#xff0c;在里面选择需要添加的python环境&#xff0c;如…...

ansible基础

ansible 1.概述 ansible是基于python语言开发&#xff0c;配置管理和部署应用的工具。批量的配置&#xff0c;部署&#xff0c;管理“上千台”主机 &#xff08;实际一次100台左右&#xff09;&#xff0c;ansible只要在一台主机上就可以对其他主机进行操作。 &#xff08;1&…...

人工智能之深度学习_[2]-PyTorch入门

PyTorch 1.PyTorch简介 1.1 什么是PyTorch PyTorch是一个基于Python的科学计算包 PyTorch安装 pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simplePyTorch一个基于Python语言的深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行…...

基于Java的语音陪聊软件——支持聊天私聊-礼物系统-直播系统-缘分匹配-游戏陪玩

丰富的经验、成熟的技术&#xff0c;打造适合当下市场发展的语音交友软件源码。Java 语言凭借其独特的优势&#xff0c;为这款语音陪聊软件的稳健运行和持续发展奠定了坚实基础。它不仅融合了聊天私聊、礼物系统和直播系统等实用且有趣的功能&#xff0c;还创新性地引入了缘分匹…...

Go语言的文件操作

Go语言的文件操作 Go语言是一种开源的编程语言&#xff0c;由谷歌开发&#xff0c;具有简单、高效和并发的特点。在日常开发中&#xff0c;文件操作是一个非常重要且常见的任务。从读取配置文件到写入日志文件&#xff0c;从处理数据到存储结果&#xff0c;文件操作无处不在。…...

php审计1-extract函数变量覆盖

php审计1-extract函数变量覆盖 这是一个关于php审计的栏目&#xff0c;本人也是初学者&#xff0c;分享一下网上的关于php审计的一些知识&#xff0c;学习一下php的语法&#xff0c;顺便记录一下学习过程。 以下是一个关于php审计ctf题 <?php$flagflag.txt; extract($_…...

百度热力图数据原理,处理及论文应用7

目录 0、数据简介0、示例数据1、百度热力图数据日期如何选择1.1、其他实验数据的时间1.2、看日历1.3、看天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1.1 ** 这个比较重要&#xff0c;后面还会再次出现。核密度的值怎么理解&#xff1f;**3.1.2 Csv->…...

端口镜像和端口安全

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c;端口镜像二&#xf…...

Elasticsearch:Jira 连接器教程第一部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 将我们的 Jira 内容索引到 Elaasticsearch 中以创建统一的数据源并使用文档级别安全性进行搜索。 在本文中&#xff0c;我们将回顾 Elastic Jira 原生连接器的一个用例。我们将使用一个模拟项目&#xff0c;其中一家银行正在开发…...

ThreeJs功能演示——几何体操作导入导出

1、内部创建几何体导出编辑能力 1&#xff09;支持内部创建的面、正方体、球体 内部创建物体时&#xff0c;如果是三维物体&#xff0c;要创建集合形状geometry&#xff0c;和对应的材质material。再一起创建一个三维物体。 // 存储创建的几何体列表const geometries [];cre…...

LeetCode::2270. 分割数组的方案数

2270. 分割数组的方案数 思路 前缀和 提示 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真&#xff0c;那么 nums 在下标 i 处有一个 合法的分割 &#xff1a; 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元…...