初识 Express(基于 NodeJS http 模块封装的 Web 框架)

news2025/3/1 16:03:44

初识 Express(基于 NodeJS http 模块封装的 Web 框架)

  • 参考
  • 描述
  • Express
      • 获取
  • nodemon
      • 获取
      • 使用
  • 使用
      • 创建一个基本的服务器
      • 基本路由
          • 对客户端的 GET 请求进行响应
          • 获取通过 GET 方式提交的 URL 参数
            • 静态 URL 参数
            • 动态 URL 参数
      • 静态资源托管服务器
          • public
          • 前缀

参考

项目描述
Express中文官网
哔哩哔哩黑马程序员
搜索引擎Bing

描述

项目描述
NodeJSv18.13.0
nodemon2.0.20
npm8.19.3
Edge109.0.1518.61 (正式版本) (64 位)
Express4.18.2

Express

Express 是基于 NodeJS 的内置模块 http 模块封装而成的,相比 http 模块,Express 使用起来更为便捷,功能也更加强大。

获取

首先,请打开终端并使用 cd 命令切换工作目录至项目文件的根目录下。完成上述操作后,在终端中输入如下命令已安装 Exprees:

npm install Express

注:

使用上述命令前请确保你已经安装 npm (NodeJS 包管理工具,该工具默认同 NodeJS 一同安装)。如果你不确认是否已经安装,可以使用如下命令进行检测:

npm -v

如果正确打印了 npm 的版本信息,则表明你已经成功安装 npm。如果你没有安装 npm 或对 npm 不是很了解,欢迎移步至我的另一篇博客 NodeJS 之 npm(NodeJS Package Manager)包管理工具

nodemon

获取

在使用 NodeJS 进行 Web 开发时,你可能需要经常性的重启项目来查看效果,这对程序员来说是个大问题。如果你安装了 nodemon ,那么在你保存 JavaScript 文件时(即使你没有修改该文件),nodemon 将自动重启项目。

你可以使用 npm 来对 nodemon 进行全局安装(使用这种安装方式进行安装,你可以在其他项目中使用被安装的模块),使用如下命令通过 npm 对 nodemon 进行安装:

npm install -g nodemon

使用

如果你希望使用 nodemon 来自动重启你的项目,你需要使用如下命令来对该项目中的某一文件(通常是 index.js)进行打开:

nodemon index.js

在你使用该命令后对文件进行打开后,如果你保存了文件,终端中将打印如下(类似)信息,表示程序正在进行重启项目的操作。

[nodemon] restarting due to changes…
[nodemon] starting `node index.js`
[nodemon] clean exit - waiting for changes before restart

使用

创建一个基本的服务器

// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

基本路由

对客户端的 GET 请求进行响应
// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

// 处理客户端的 GET 请求
app.get('/', (req, res) => {
    res.send('Hello 中国');
})

效果:
效果

注:

  1. 你需要向 app.get() 提供两个参数,其中第一个为 GET 请求访问的网页路径( / 表示根路径,即 http://127.0.0.1:8080/);
    第二个参数为服务器端接收到客户端发送的 GET 请求后需要执行的回调函数。你可以向该函数提供两个参数以接收两个实参,其中第一个实参为 代表客户端的请求对象,第二个实参为 代表服务器端的响应对象
  2. 当监听端口为 80 时,你可以直接访问 http://127.0.0.1 而不需要指定端口号,因为 80 端口为 http 服务使用的默认端口。
  3. 可以看到该程序成功的输出了中文(没有发生乱码),我们并没有设置响应头以告知客户端浏览器响应内容使用的编码方式。在使用 http 模块时,需要认为设置响应头以指明使用的编码方式,否则中文将乱码显示。
获取通过 GET 方式提交的 URL 参数

通过 GET 方式对数据进行提交,需要在 URL 中添加相应的参数。常见的参数形式有两种,即静态 URL 参数及动态 URL 参数。

静态 URL 参数
// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

// 处理客户端的 GET 请求
app.get('/:name', (req, res) => {
    res.send(req.params);
})

效果:

在运行该服务器后,访问链接 http://127.0.0.1:8080/RedHeart,你将得到如下显示结果。

效果

注:

  1. 当我们设置 app.get() 的第一个参数为 ‘/:name’ 时,在 :name 所处的位置传递参数,参数名都将为 name。当然你也可以使用其他参数名。
  2. Express 会自动对 URL 进行分析,并提取其中的静态 URL 参数,你可以通过 Express 提供的接口 req.params 来获取 URL 参数的分析结果。
  3. 你可以设置不止一个的静态参数,比如为上述服务器再添加一个 age 静态参数。你可以将 app.get() 的第一个参数改为 ‘/:name/:age’
动态 URL 参数
// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

// 处理客户端的 GET 请求
app.get('/', (req, res) => {
    res.send(req.query);
})

效果:

在运行该服务器后,访问链接 http://127.0.0.1:8080/?name=RedHeart,你将得到如下显示结果。

效果

注:

  1. 当我们设置 app.get() 的第一个参数为 ‘/’ 时,你可以在网页根路径传递参数,传递参数使用的具体格式为:
?参数1=参数值1&参数2=参数值2

当然你还可以添加其他参数,只不过需要通过 & 来进行连接。

  1. Express 会自动对 URL 进行分析,并提取其中的动态 URL 参数,你可以通过 Express 提供的接口 req.query 来获取 URL 参数的分析结果。

静态资源托管服务器

Web 中,静态资源指的是固定的内容,客户端访问该资源时,服务器将直接将该资源返回给客户端。
与此相对的动态资源则是动态的内容,客户端访问该类资源时,服务器将对其进行改动,再将改动后的资源返回给客户端。

public

我们可以在项目根路径中创建 public 文件夹,该文件夹中的资源将被服务器托管,客户端可以对资源进行访问。
为了进行演示,我将在该文件夹中存放 content.txt 文件,该文件中的内容为:

世界上有两种罪,你笑是一种,你不笑是另一种。

使用如下代码实现对 public 文件夹中的内容进行托管。

// 导入 NodeJS 中的内置模块 path 对路径进行拼接
const path = require('path');

// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

// 使用 Express 提供的中间件函数 static() 实现
// 静态资源的托管。
app.use(express.static(path.join(__dirname, '../public')))

效果:

在运行该服务器后,访问链接 http://127.0.0.1:8080/content.txt,你将得到如下显示结果。

结果

注:

  1. express.static() 接收一个实参,用于指定需要被托管的文件夹。
  2. __dirname 指的是当前文件所在的文件夹。
  3. 使用 path.join() 函数对路径进行拼接是为了防止发生动态路径拼接问题,如果希望对该问题进行了解,欢迎移步至我的另一篇博客 NodeJS 之 fs 模块(路径动态拼接问题)
前缀

如果你希望访问静态资源文件中的资源时,需要添加指定的路径前缀,可以为 app.use() 函数添加指定的路径前缀作为该函数的第一个参数。如下示例我将添加前缀 RedHeart/TwoMoons

// 导入 NodeJS 中的内置模块 path 对路径进行拼接
const path = require('path');

// 导入 Express 第三方模块
const express = require('express');

// 创建服务器对象
const app = express();
// 监听本机端口 8080
app.listen(8080, () => { 
    console.log('【 http://127.0.0.1:8080 】')
})

// 使用 Express 提供的中间件函数 static() 实现
// 静态资源的托管。
app.use('RedHeart/TwoMoons', express.static(path.join(__dirname, '../public')))

效果:

此时如果你访问链接 http://127.0.0.1:8080/RedHeart/TwoMoons/content.txt,将获得 content.txt 文件中的内容。

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

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

相关文章

steam搬砖,蓝海信息差副业项目

今天就给大家分享下这个steam搬砖项目的玩法,看完你收藏执行,学不会你可以随便骂我!! 首先我们讲一下项目原理: 我们需要利用国外steam平台来赚取差价,简单点就是在游戏里面搬砖购买一些道具,然…

零基础学Python(全彩版)

ISBN: 978-7-5692-2225-8 编著:明日科技 页数:448页 阅读时间:2022-08-14 推荐指数:★★★★★ 一本非常适合入门的Python 3编程教程书籍, 不仅有视频教程还有很多的代码示例, 让你在一步步学习中掌握Pytho…

力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——645. 错误的集合、657. 机器人能否返回…

【vue2】对路由的理解

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:vue路由概念、路由写法、路由模式、路由重定向、路由跳转传参方式 目录 一、vue路由概念…

Tkinter的Checkbutton控件

Tkinter的Checkbutton是一个有着许多选项的控件,可以一次选择几个选项 使用方法 var1tk.IntVar() var2tk.IntVar() def printf():if (var1.get()1)&(var2.get()0):L.config(text1)elif (var1.get()0)&(var2.get()1):L.config(text2)elif (var1.get()0)&am…

【docker实践遗留问题】解决个人制作镜像在 dockerhub 上拉取缓慢的问题

目录背景正文1. 创建阿里云docker仓库2. 修改本地 pom 文件尾声背景 通过不断实践,发现了一个问题:dockerHub服务器在国外,虽然拉取一些常用依赖时,可以通过更改镜像源的方式来解决,但倘若是自己制作的docker镜像&…

Python3 条件控制

Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 IF-ELSE判断 常用的if-else语句,通常用于二分支结构的条件语句代码。 Python 中用 elif 代替了else if,所以if语句的关键字为&#xff1a…

【机器学习】(西瓜书习题8.5)编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。

(1)问题理解与分析 编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。 (2)Bagging算法原理阐述 若想得到泛化性能强的集成&#xf…

6、算术运算符与算术表达式

目录 一、算术运算符 二、算术表达式 三、优先级与结合性 1. 算术运算符的优先级 2. 算术运算符的结合性 四、自增/自减运算符 一、算术运算符 算术运算符包括两个单目运算符(正和负)和5个双目运算符(即乘法、除法、取模、…

ARP渗透与攻防(六)之限制网速攻击

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP限制网速攻击 大家没想到吧,ARP还能限制对方网速。当kali欺骗了网关和受…

Linux-Ubuntu入门到精通之常用终端指令之操作文件目录和文件内容(2)

常用的终端命令 ctrl shift 放大终端窗口的字体显示 ctrl - 缩小终端窗口的字体显示 按 上/下 光标键可以在曾经使用过的命令之间来回切换 如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl c . ls 常用选项(白色…

DFS(四)39. 组合总和 1079. 活字印刷

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

flowable定时任务和表单

流程定义定时激活 : act_re_procdef 的 suspension_status ClassPathResource classPathResource new ClassPathResource("hehe/HistoryDemo01.bpmn20.xml");repositoryService.createDeployment().addInputStream(classPathResource.getFilename(),clas…

【HBase入门】3. HBase数据模型

简介 在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。 { “zzzzz” : “woot”, “xyz” : “hello”, “aaaab” : “world”, “1” : “x”, “aaaaa” : “y” } 术语 表…

MCAL系列介绍05-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块(ICU)解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

ROS学习寄录之知识学习

1 ROS核心概念 1.1 节点(Node) (1)执行具体任务的进程、独立运行的可执行文件 (2)不同节点可以使用不同的语言,可分布式运行在不同的主机 (3)节点在系统中的名称必须…

HTML总结

web开发是创建Web页面或App等前端界面呈现给用户的过程。web开发开发是从网页制作演变而来,早期网站主要内容都是静态,用户使用网站的行为也以浏览为主。随着互联网技术的发展,各种终端设备应用程序与用户沟通交互的界面,都是由We…

Java基础 Stream流方法引用异常文件

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

关于2倍图的理解

在电脑端1个css像素1个物理像素 所以一个长宽都是100px的照片&#xff0c;需要100✖100px的物理像素 而在移动端存在多倍图的关系&#xff0c;假如是2倍图的关系 即&#xff1a;1个css像素需要2个物理发光点 假如现在有一个长宽都是100px像素的照片 放在手机上也是长宽也是100…

TCP/IP IP地址概念与应用

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.什么是IP地址 二.IP地址的组成 三.IP地址分类 A类IP地址 …