Node学习笔记之Express框架

news2024/11/26 4:57:08

一、express 介绍

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/

简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)

二、Express 能做什么

对于前端程序员来说,最常见的两种服务器,分别是:

⚫ Web 网站服务器:专门对外提供 Web 网页资源的服务器。

⚫ API 接口服务器:专门对外提供 API 接口的服务器。

使用 Express,我们可以方便、快速的创建 Web 网站的服务器或 API 接口的服务器。

三、express 使用

2.1 express 下载

express 本身是一个 npm 包,所以可以通过 npm 安装

npm init 
npm i express

2.2 express 初体验

2.2.1监听 GET 请求

通过 app.get() 方法,可以监听客户端的 GET 请求,具体的语法格式如下:

2.2.2监听 POST 请求

通过 app.post() 方法,可以监听客户端的 POST 请求,具体的语法格式如下:

2.2.3把内容响应给客户端

通过 res.send() 方法,可以把处理好的内容,发送给客户端

2.2.4获取 URL 中携带的查询参数

通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数:

2.25获取 URL 中的动态参数

通过req.params对象,可以访问到 URL 中,通过:匹配到的动态参数:

大家可以按照这个步骤进行操作:

// 1、引入express模块并创建express对象
const express = require('express');
const app = express();

// 2、创建路由规则
app.get('/', (req, res) => {
    // 这里的代码在浏览器以get请求/的时候执行,  
    // 这个函数就是用来处理浏览器的 对于/的get请求 的
    // 第一个参数req是请求头对象,里面包含请求头信息
    // 第二个参数res用来做响应
    console.log(req);

    res.send('Hello World!222');
});

// 3、监听端口
app.listen(3000, () => {
    //这里的代码服务器刚启动的时候执行1次
    console.log('Example app listening on port 3000!')
});

三、express 路由

3.1 什么是路由

官方定义: 路由确定了应用程序如何响应客户端对特定端点的请求

3.2 路由的使用

在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。

Express 中的路由分 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数,格式如下:

express 中提供了一系列方法,可以很方便的使用路由,使用格式如下:

app.<method>(path,callback)

3.3路由的匹配过程

每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数。

在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理。

路由匹配的注意点:

①按照定义的先后顺序进行匹配

②请求类型和请求的URL同时匹配成功,才会调用对应的处理函数

3.4模块化路由Router

express 中的 Router 是一个完整的中间件和路由系统,可以看做是一个小型的 app 对象。

Router 作用

对路由进行模块化,更好的管理路由

Router 使用

//1. 导入 express

const express = require('express');

//2. 创建路由器对象

const router = express.Router();

//3. 在 router 对象身上添加路由

router.get('/', (req, res) => {
 res.send('首页');
})

router.get('/cart', (req, res) => {
 res.send('购物车');
});

//4. 暴露

module.exports = router;

为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块。将路由抽离为单独模块的步骤如下:

①创建路由模块对应的 .js 文件

②调用express.Router() 函数创建路由对象

③向路由对象上挂载具体的路由

④使用module.exports 向外共享路由对象

⑤使用app.use() 函数注册路由模块

步骤

创建路由模块

注册路注册路由模块

为路由模块添加前缀

类似于托管静态资源时,为静态资源统一挂载访问前缀一样,路由模块添加前缀的方式也非常简单:

四、express 响应设置

express 框架封装了一些 API 来方便给客户端响应数据,并且兼容原生 HTTP 模块的获取方式

//获取请求的路由规则

app.get("/response", (req, res) => {
 //1. express 中设置响应的方式兼容 HTTP 模块的方式

 res.statusCode = 404;
 res.statusMessage = 'xxx';
 res.setHeader('abc','xyz');
 res.write('响应体');
 res.end('xxx');
 //2. express 的响应方法

 res.status(500); //设置响应状态码

 res.set('xxx','yyy');//设置响应头

 res.send('中文响应不乱码');//设置响应体

 //连贯操作

 res.status(404).set('xxx','yyy').send('你好朋友')
 //3. 其他响应

 res.redirect('http://atguigu.com')//重定向

 res.download('./package.json');//下载响应

 res.json();//响应 JSON

 res.sendFile(__dirname + '/home.html') //响应文件内容

});

五、express 中间件

5.1 什么是中间件

中间件(Middleware)本质是一个回调函数 中间件函数 可以像路由回调一样访问 请求对象(request) , 响应对象(response)

5.2 中间件的作用

中间件的作用 就是 使用函数封装公共操作,简化代码

5.3 中间件的类型

全局中间件 路由中间件

5.3.1 定义全局中间件

每一个请求 到达服务端之后 都会执行全局中间件函数

格式如下:

声明中间件函数

//获取请求的路由规则 
letrecordMiddleware=function(request,response,next){ //实现功能代码 
//..... 
//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next) 
next(); }

应用中间件

app.use(recordMiddleware);

声明时可以直接将匿名函数传递给use

app.use(function (request, response, next) {
 console.log('定义第一个中间件');
 next();
})
5.3.2 多个全局中间件

express 允许使用 app.use() 定义多个全局中间件

app.use(function (request, response, next) {
 console.log('定义第一个中间件');
 next();
})

app.use(function (request, response, next) {
 console.log('定义第二个中间件');
 next();
}) 
5.3.3 定义路由中间件

如果 只需要对某一些路由进行功能封装 ,则就需要路由中间件 调用格式如下:

app.get('/路径',`中间件函数`,(request,response)=>{
 
});

app.get('/路径',`中间件函数1`,`中间件函数2`,(request,response)=>{
 
});
5.3.4Express内置的中间件

自 Express 4.16.0 版本开始,Express 内置了3 个常用的中间件,极大的提高了 Express 项目的开发效率和体验:

①express.static快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)

②express.json解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

③express.urlencoded解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

5.4 静态资源中间件

express 内置处理静态资源的中间件

//引入express框架

const express = require('express');

//创建服务对象

const app = express();

//静态资源中间件的设置,将当前文件夹下的public目录作为网站的根目录

app.use(express.static('./public')); //当然这个目录中都是一些静态资源

//如果访问的内容经常变化,还是需要设置路由

//但是,在这里有一个问题,如果public目录下有index.html文件,单独也有index.html的路由,

//则谁书写在前,优先执行谁

app.get('/index.html',(request,response)=>{
 respsonse.send('首页');
});

//监听端口

app.listen(3000,()=>{
 console.log('3000 端口启动....');
});

注意事项:

1. index.html 文件为默认打开的资源

2. 如果静态资源与路由规则同时匹配,谁先匹配谁就响应

3. 路由响应动态资源,静态资源中间件响应静态资源

5.5 获取请求体数据 body-parser

express 可以使用body-parser包处理请求体

第一步:安装

npm i body-parser

第二步:导入 body-parser 包

constbodyParser=require('body-parser');

第三步:获取中间件函数

//处理 querystring 格式的请求体

leturlParser=bodyParser.urlencoded({extended:false}));

//处理 JSON 格式的请求体

letjsonParser=bodyParser.json();

第四步:设置路由中间件,然后使用request.body来获取请求体数据

app.post('/login', urlParser, (request,response)=>{ //获取请求体数据

//console.log(request.body);

//用户名

console.log(request.body.username); //密码

console.log(request.body.userpass); response.send('获取请求体数据'); });

获取到的请求体数据:

[Object: nullprototype] { username: 'admin', userpass: '123456' }

下一篇如何利用express框架写接口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于卷积优化优化的BP神经网络(分类应用) - 附代码

基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.卷积优化优化BP神经网络3.1 BP神经网络参数设置3.2 卷积优化算法应用 4.测试结果…

codeforces (C++ Chemistry)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、n组数据&#xff0c;每组输入两个数t,k和一个字符串&#xff0c;删除k个字符&#xff0c;剩下的字符能组成回文&#xff0c;则输出YES&#xff0c;否则输出NO。 2、用map记录字符串中每个字符出现的次数&#xff0c;su…

Unity学习shader笔记[二百]仿马赛克效果碎片画思路

最近看到个场景的图片&#xff0c;对他的生成有点兴趣&#xff0c;就想了解。 清晰的画面经过后处理后变成这种。思路和马赛克基本一样。 美术处理 这种图片处理 本身ps就有&#xff0c;美术方便的话&#xff0c;可以让美术给图&#xff0c;然后给出的网格里面uv分布是0到1&…

Spark内核调度

目录 一、DAG &#xff08;1&#xff09;概念 &#xff08;2&#xff09;Job和Action关系 &#xff08;3&#xff09;DAG的宽窄依赖关系和阶段划分 二、Spark内存迭代计算 三、spark的并行度 &#xff08;1&#xff09;并行度设置 &#xff08;2&#xff09;集群中如何规划并…

给Windows文件夹添加备注信息

自己的电脑中文件夹为了安装各种开发环境&#xff0c;基本都是英文字母命名&#xff0c;就导致好多东西猛地一看找不着。此时加个备注会不会就好很多呢&#xff1f;就如以下这种 设置方法&#xff1a; 1、展示备注 右键展示的列表头部&#xff0c;会出现展示项&#xff0c;一…

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

Jenkins+Ant+Jmeter接口自动化集成测试

一、Jenkins安装配置 1、安装配置JDK1.6环境变量&#xff1b; 2、下载jenkins.war&#xff0c;放入C:\jenkins目录下&#xff0c;目录位置随意&#xff1b; Jenkins启动方法&#xff1a; cmd进入Jenkins目录下&#xff0c;执行java -jar jenkins.war 浏览器输入&#xff1a;l…

Server Name Indication(SNI),HTTP/TLS握手过程解析

Server Name Indication&#xff08;SNI&#xff09;是一种TLS扩展&#xff0c;用于在TLS握手过程中传递服务器的域名信息。在未使用SNI之前&#xff0c;客户端在建立TLS连接时只能发送单个IP地址&#xff0c;并且服务器无法知道客户端请求的具体域名。这导致服务器需要使用默认…

Spring中动态代理设计模式

目录 一、什么是动态代理 二、动态代理开发步骤 2.1 搭建开发环境 2.2 具体过程 三、动态字节码技术 四、动态代理开发简化代理开发 一、什么是动态代理 其实不管是静态代理还是动态代理其本质都是一样的&#xff0c;都是通过代理类为目标类增加额外功能&#xff0c;从而方便目…

Day7力扣打卡

打卡记录 合法分组的最少组数&#xff08;贪心&#xff09; 链接 举例说明&#xff0c;假设 c n t [ x ] 32 cnt[x]32 cnt[x]32&#xff0c; k 10 k10 k10&#xff0c;那么 32 10 10 10 2 321010102 321010102&#xff0c;多出的 2 2 2 可以分成两个 1 1 1&#xf…

Verilog基础:$fopen和$fclose系统函数、任务的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 $fopen和$fclose是两个用于打开和关闭文件的系统函数、任务。最初&#xff0c;在Verilog-1995标准中&#xff0c;最多只能同时打开32个文件&#xff0c;其所使用的…

Flink部署模式及核心概念

一.部署模式 1.1会话模式&#xff08;Session Mode&#xff09; 需要先启动一个 Flink 集群&#xff0c;保持一个会话&#xff0c;所有提交的作业都会运行在此集群上&#xff0c;且启动时所需的资源以确定&#xff0c;无法更改&#xff0c;所以所有已提交的作业都会竞争集群中…

2023/10/22总结

项目上 登录注册忘记密码已经全部完善——连接数据库&#xff0c;发送验证码等 把ER图和项目功能点也给做完了&#xff08;可能后期还需要修改 &#xff0c;因为问题会在实践的时候出现&#xff09; 功能点图 刷题记录 接下来的任务是争取早日完成这个项目。

图论04-【无权无向】-图的广度优先遍历BFS

文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时&#xff0c;将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时&#xff0c;将…

Python基础入门例程4-NP4 读入整数数字

描述 在学会读入字符串以后&#xff0c;小白还想要读入整数&#xff0c;请你帮他使用input函数读入数字并输出数字与变量类型。 输入描述&#xff1a; 输入只有整数。 输出描述&#xff1a; 将输入的数字输出&#xff0c;同时换行输出变量类型。 示例1 输入&#xff1a; …

《算法通关村第二关黄金挑战一一K个一组反转》

《算法通关村第二关黄金挑战一一K个一组反转》 描述 每 k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 解法 头插法 理解…

【超级基础版】十进制与二进制的转换

目录 一、为什么是二进制&#xff1f; 二、二进制的加法和乘法 三、二进制向十进制转换 四、十进制整数向二进制转换 五、十进制小数向二进制小数的转换 六、八进制和十六进制的引入 一、为什么是二进制&#xff1f; 我们知道电脑的数据本质上是0和1&#xff0c;就是我们…

已更新!c++第四章知识点合集(自定义函数的格式和使用方法详解, #include,函数的嵌套 递归,局部变量与全局变量的区别等等)

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL知识点持续更新中 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL-第三章节DCL-管理用户&…

库函数qsort的使用

在排序时&#xff0c;我们通常写的函数只能排一种固定的类型&#xff0c;那有没有一种方法可以用来对所有的数据类型&#xff0c;进行排序呢&#xff1f;库函数中的qsort函数就可以实现这种排序。 首先qsort的函数参数有四个&#xff0c;第一个是数组的起始地址(即数组名)&…

【ML】cheatsheet

LR 原理与面试题目DT, Adaboost, GBDT, xgboost 原理 细节 与 例子 https://www.cnblogs.com/createMoMo/p/12635709.html xgboost挺详细的算法原理与例子 https://zhuanlan.zhihu.com/p/660468945 着重lightgbm就xgboost的改善方向 https://zhuanlan.zhihu.com/p/366952043机器…