Node.js:Express 服务 路由
Node.js:Express 服务 & 路由
- 创建服务
- 处理请求
- req对象
- 静态资源托管
- 托管多个资源
- 挂载路径前缀
- 路由
- 模块化
Express
是Node.js
上的一个第三方框架,可以快速开发一个web
框架。本质是一个包,可以通过npm
直接下载。
创建服务
Express
创建一个服务器的流程非常简单:
- 导入
Express
包 - 实例化
Express
为一个服务 - 监听端口,开始服务
如下:
const express = require('express')
const app = express()app.listen(80, () => {console.log("创建web服务成功")
})
处理请求
当Express
被实例化为app
服务后,就可以通过这个服务来进行请求处理:
app.get('url', (req, res) => {// ...
})app.post('url', (req, res) => {// ...
})
以上两个方法,分别处理get
和post
请求,触发回调函数,req
是请求信息,res
是响应信息,这和http
模块类似。
如果在处理请求时,需要向客户端发送消息,调用res.send
方法:
app.get('/login', (req, res) => {res.send("hello Express")
})
运行服务后,访问127.0.0.1
就可以得到响应结结果:
req对象
在使用get
请求时,常会通过?
携带一些参数信息,这些参数可以通过req.query
获取到。
app.get('/login', (req, res) => {res.send(req.query)
})
启动服务后,用户携带的参数存储在req.query
中,直接将这个对象发回给浏览器:
访问服务器时,携带了数据?name=zhangsan&age=20
,最后被服务器发送回来,以json
的格式展示在浏览器中。
处理通过?
携带的键值对形式参数,url
还可以携带动态参数/:id
,此处以:
表示后面是一个动态参数,这个路径可以匹配任意一个字符串。
如果需要得到这个动态参数,就需要req.params
对象,其存储了动态参数。
app.get('/user/:id', (req, res) => {res.send(req.params)
})
在指定路径时,以:id
结尾,表示这个路径可以匹配一个动态参数,参数名为id
。动态参数存储在req.params
中,直接把这个对象返回给浏览器。
访问/user/:115599
:
req.params
拿到了动态参数id = 115599
。
匹配多个动态参数:
app.get('/user/:id/:name', (req, res) => {res.send(req.params)
})
此处匹配两个动态参数id
和name
。
静态资源托管
当网站中有多个html
、css
、js
文件,此时如果一个个完成get
方法会很麻烦。为此express
提供了一个express.static
方法,它可以快速创建一个静态资源服务器,指定一个目录作为根目录,该目录下的所有文件都可以直接进行访问。
语法:
app.use(express.static(目录路径))
首先通过express.static
指定一个目录,此时该目录下的所有资源都可以被访问。再将返回值作为app.use
的参数传入,此时就完成了静态资源托管。
示例:
const express = require('express')
const path = require('path')const app = express()
app.use(express.static(path.join(__dirname, "/root")))app.listen(80, () => {console.log("success!")
})
此处引入了一个path
模块,防止路径错误。express.static
指定同级目录下的/root
目录作为服务的根目录,该目录下有index.html
和style.css
两个文件。
在浏览器中访问这两个文件:
两个文件都可以直接访问,虽然没有写app.get("/root/index.html")
这样的方法,但是通过静态资源托管,就直接可以进行访问了。
托管多个资源
如果需要同时托管多个目录下的静态资源,可以多次执行app.use(express.static(目录路径))
。
app.use(express.static("./public"))
app.use(express.static("./files"))
这样public
和files
两个目录下的文件,都被托管了。浏览器请求文件时,按照托管的顺序查询,假设两个目录内部都有index.html
,由于public
先托管,浏览器会得到public/index.html
。
挂载路径前缀
在静态资源托管指定目录后,目录内部的文件可以直接被访问,无需指明该文件在哪一个目录下。
app.use(express.static("./public"))
比如以以上形式托管静态资源,最终访问服务器就以127.0.0.1/index.html
即可,public
目录不会出现在路径中,如果访问127.0.0.1/public/index.html
反而会出错,找不到路径。
如果希望用户访问静态资源时,要加上这个路径前缀,那么可以在app.use
时添加一个路径前缀。
app.use(`/public`, express.static("./public"))
此时就可以通过127.0.0.1/public/index.html
进行访问了。当然也不一定说前面这个路径前缀一定要和托管的目录名称相同,可以自己指定:
app.use(`/abc`, express.static("./public"))
这样就可以通过127.0.0.1/abc/index.html
访问资源。
之前说过,在多个目录被托管时,如果有同名文件,就会发生覆盖,只能访问到先托管那个目录下的文件。如果加上路径前缀,就可以解决这个问题:
app.use("/public", express.static("./public"))
app.use("/files", express.static("./files"))
想要访问两个不同的index.html
,只需要加上不同的前缀即可:
127.0.0.1/public/index.html
127.0.0.1/files/index.html
路由
Express
要为每一种类型的请求,都绑定一个函数来处理。当Express
收到一个请求,就会进行匹配,找到对应的函数,然后执行,这个过程就是路由
。
路由分为三部分:请求类型
、url
、处理函数
。
上图中有三个路由,其中第一个路由请求的地址是/
与后两者不同。虽然后两个路由请求的都是/index.html
,但是它们请求的方法不同。
当一个请求到来,Express
会进行路由匹配,找到请求类型
、url
都相同的函数,然后执行它。
当一个路由绑定了多个函数,只有第一个生效。
app.get('/', (req, res) => {res.send("func1")
})app.get('/', (req, res) => {res.send("func2")
})
以上代码,为get /
绑定了两个函数,此时由于func1
先定义,只有func1
会生效。
模块化
先前的所有路由,都是直接挂载到app
这个对象上的,其实Express
并不建议这么做,而是建议将路由单独做成一个模块。
模块化路由流程:
- 创建一个新模块(
.js
文件) - 调用
express.Router
方法创建路由对象 - 往路由对象上挂载路由
- 使用
module.exports
向外共享路由 - 使用
app.use
注册路由模块
示例:
以下操作均在router.js
模块中。
创建路由对象:
const express = require('express')
const router = express.Router()
路由对象是express
的一个对象,专门用于挂载路由。
挂载路由:
router.get('/', function(req, res){res.send("get / success")
})router.post('/', function(req, res){res.send("post / success")
})router.get('/index.html', function(req, res){res.send("get /index.html success")
})
此时直接把路由挂载到router
对象上,而不是app
对象上。
使用module.exports
向外共享路由:
module.exports = router
此时一个路由模块就制作完成了,要注意不能写为exports = router
,因为这样会导致exports
和module.exports
指向不同对象,最后没有成功共享router
。
在main.js
中导入模块:
const express = require('express')
const router = require('./router.js')
const app = express()
注册路由:
app.use(router)
直接将路由对象通过use
注册到app
中。
路由和静态资源托管一样,都是通过app.use
进行绑定的,那么路由自然也可以增加路径访问前缀:
app.use('/test', router)
这样访问路由内部的所有路径时,都要先加上前缀/test
。
相关文章:

Node.js:Express 服务 路由
Node.js:Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架,可以快速开发一个web框架。本质是一个包,可以通过npm直接下载。 创建服务 Express创建一…...

C++之多态(上)
C之多态 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…...
PySpark单机模式安装教程
目录 1. 环境准备 1.1 安装要求 1.2 检查Python和Java环境 2. 下载并解压Spark 2.1 下载Spark 2.2 解压安装包 3. 配置环境变量 4. 配置Spark 5. 启动Spark Shell 6. 运行测试 7. 关闭Spark Shell 8. 常见问题 8.1 兼容性问题 8.2 环境变量配置 总结 1. 环境准备…...

DEVOPS: 认证与调度
概述 不知道大家有没有意识到一个现实,就是大部分时候,我们已经不像以前一样通过命令行,或者可视窗口来使用一个系统了现在我们上微博、或者网购,操作的其实不是眼前这台设备,而是一个又一个集群 通常,这样…...

ICPC区域赛成都站【赛后回顾+总结】
传送门 前言赛后总结赛后回顾赛后感悟 前言 首先,这是本人本赛季第一场XCPC区域赛,也是本人算竞生涯中第一场XCPC区域赛(之前只打过邀请赛和省赛)。 赛后总结 然后赛后总结一下:我队天崩开局,我队出师不利…...

保险大模型革新:全面自动化倒计时
摘 要 大模型于保险业不仅是一个技术升级的过程,更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利(KevinKelly)曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年,…...

《使用Gin框架构建分布式应用》阅读笔记:p212-p233
《用Gin框架构建分布式应用》学习第12天,p212-p233总结,总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用,作为后…...

点云聚类学习 KMeans/DBSCAN
点云聚类学习--KMeans/DBSCAN OverviewKMeansDBSCAN简单对比 Overview 最近做的东西会处理一些Lidar的点云数据,虽然之前在看Autoware的时候有了解一些聚类的基本原理和实现,但还是稍微再学习一下聚类方法吧,这里就简单记录一下(…...

反悔贪心
Problem - C - Codeforces(初识反悔贪心) 题目: 思路: 代码: #include <bits/stdc.h> #define fi first #define se secondusing namespace std; typedef pair<int,int> PII;string a, b, ans; bool vis…...
汽车软件融合分析
随着汽车智能化、互联化的不断发展,软件在汽车中的重要性日益彰显。从硬件定义汽车,到软件定义汽车,再到AI定义汽车,汽车产业的变革正在加速进行。在这一变革中,软件融合成为了一个重要的趋势。本文将从多个角度对汽车…...

机器人和智能的进化速度远超预期-ROS-AI-
危机 通常,有危险也有机遇才称之为危机。 从2020年启动转型自救,到2021年发现危险迫在眉睫,直到2024年也没有找到自己满意的出路。 共识 中产阶级知识分子共有的特性和一致的推断。 200年前的推断,在如今得到了验证。 机器人…...

5天学习RAG路线图,你信吗?
RAG是"Retrieval Augmented Generation"的缩写,让我们来拆解这个术语,了解RAG的本质: R -> Retrieval(检索) A -> Augmented(增强) G -> Generation(生成&…...
JIME智创:抖音创作者的AI绘画与视频生成创作神器
在短视频和社交内容创作的时代,创意和速度成了成功的关键。无论是视频博主、图文创作者还是品牌推广人,他们都面临着如何快速生成高质量图片与视频素材的挑战。JIME智创正是针对这一需求推出的AI创作工具,专为抖音的图文和视频创作者设计&…...

基于SpringBoot和PostGIS的世界各国邻国可视化实践
目录 前言 一、空间数据查询基础 1、空间数据库基础 2、空间相邻查询 二、SpringBoot后台功能设计 1、后台查询接口的实现 2、业务接口设计 三、Leaflet进行WebGIS开发 1、整体结构介绍 2、相邻国家展示可视化 四、成果展示 1、印度及其邻国 2、乌克兰及其邻国 3、…...
Halcon相机外参自理解
外参描述了相机在世界坐标系中的位置和朝向,即它将世界坐标转换为相机坐标的几何变换。具体来说,外参包括一个 旋转矩阵 R R R 和一个 平移向量 t t t,它们共同构成了将世界坐标变换到相机坐标系的刚体变换 相机标定的Pose0代表了相机在外界…...
C#语言入门:从基础到进阶
C#(发音为"C sharp")是微软公司推出的一种面向对象的编程语言,它由Anders Hejlsberg和他的团队在.NET框架下开发。C#语言结合了C和Java的特性,并添加了新的功能,使其成为当今最流行的编程语言之一。 C#的特…...
网络爬虫的定义
网络爬虫,即Web Spider,是一个很形象的名字。 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。 网络蜘蛛是通过网页的链接地址来寻找网页的。 从网站某一个页面(通常是首页)开始,读取网页…...

一个月调研分析标的“英伟达”
放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今,若选一只股票长期持有,最佳解是 ARM(涨了 20 倍),因为无论系统层和应用层谁胜出,底层一定是芯片,而…...

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战
数据的并行导出与压缩下载:EasyExcel:实现大规模数据的并行导出与压缩下载 构建高效排队导出:解决多人同时导出Excel导致的服务器崩溃 SpringBoot集成EasyExcel 3.x: 前言 在企业级应用开发中,常常需要处理复杂的 …...

什么是严肃游戏,严肃游戏本地化的特点是什么?
“严肃游戏”是一种交互式数字体验,不仅用于娱乐,还用于教育、培训或解决问题。与主要关注乐趣和参与度的传统游戏不同,严肃游戏的目标不仅仅是娱乐,比如教授特定技能、模拟现实生活场景或提高对重要问题的认识。它们用于医疗保健…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...

免费批量Markdown转Word工具
免费批量Markdown转Word工具 一款简单易用的批量Markdown文档转换工具,支持将多个Markdown文件一键转换为Word文档。完全免费,无需安装,解压即用! 官方网站 访问官方展示页面了解更多信息:http://mutou888.com/pro…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...

持续交付的进化:从DevOps到AI驱动的IT新动能
文章目录 一、持续交付的本质:从手动到自动的交付飞跃关键特性案例:电商平台的高效部署 二、持续交付的演进:从CI到AI驱动的未来发展历程 中国…...