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: 前言 在企业级应用开发中,常常需要处理复杂的 …...
什么是严肃游戏,严肃游戏本地化的特点是什么?
“严肃游戏”是一种交互式数字体验,不仅用于娱乐,还用于教育、培训或解决问题。与主要关注乐趣和参与度的传统游戏不同,严肃游戏的目标不仅仅是娱乐,比如教授特定技能、模拟现实生活场景或提高对重要问题的认识。它们用于医疗保健…...
重塑知识连接:探索Obsidian模板驱动的Zettelkasten思维系统
重塑知识连接:探索Obsidian模板驱动的Zettelkasten思维系统 【免费下载链接】Obsidian-Templates A repository containing templates and scripts for #Obsidian to support the #Zettelkasten method for note-taking. 项目地址: https://gitcode.com/gh_mirror…...
用数据校准方向,让实习招聘更有章法
为什么盲目投流不如精准的搜索曝光? 在校招实习的日常招募中,HR常常面临一个困惑:明明岗位薪资和公司平台都不错,为什么搜索量和投递量却迟迟上不去?这往往是因为在信息密度极高的春招季,企业的校招信息被…...
4.2% 稳健扩容!工业厂房从传统基建向智慧绿色赛道破局
一、全球工业厂房市场规模工业厂房作为工业生产的核心载体,是支撑制造业发展的重要基础设施,其市场规模变化与全球工业经济活跃度高度绑定。据恒州诚思最新调研统计,2025 年全球工业厂房市场规模已达62580 亿元,在全球工业经济复苏…...
UG许可排队严重?研发软件许可共享,盘活企业资产
我干IT这十年,见过太多公司因为许可证管理不当,堵在路上的效率和成本。2026年咱们行业平均许可证利用率只有42%,烂尾的项目不少,换算成直接损失,一个中型研发团队每年光工时浪费就抵得上一整个外包团队的薪酬。许可证到…...
B站视频转换终极指南:3分钟掌握m4s转MP4永久保存技巧
B站视频转换终极指南:3分钟掌握m4s转MP4永久保存技巧 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾因B站视频突然下架而痛…...
告别Unity!用eDrawings ActiveX控件在WinForm里轻松嵌入CAD三维模型(附避坑指南)
轻量化CAD集成方案:eDrawings ActiveX控件在WinForm中的高效实践 当机械设计软件公司需要为内部物料管理系统添加零件预览功能时,技术选型往往面临两难抉择。Unity等游戏引擎虽然功能强大,但其资源占用和开发复杂度对于简单的CAD模型预览场景…...
【限时解密】DeepSeek内部SSO安全加固白皮书(含JWT签名验签绕过防护方案)
更多请点击: https://codechina.net 第一章:DeepSeek SSO单点登录体系概览 DeepSeek SSO 是面向企业级 AI 开发平台构建的统一身份认证与访问控制中枢,支持 OAuth 2.0、OpenID Connect 及 SAML 2.0 多协议接入,实现跨服务&#x…...
agent 学习路径解析 学习资源分享
文章目录 先给结论:你接下来不要优先读 GLM-4.5你对 agent 的轻视,有一半对,一半错关于 Claude Code 泄露:你应该学“架构收获”,不要沉迷“源码猎奇”你提到的 learn-claude-code 仓库:值得看,…...
别再只盯着Transformer了!用PyTorch手把手复现加性注意力(Additive Attention),理解注意力机制的起点
从加性注意力到Transformer:PyTorch实战与演进逻辑解析 在Transformer架构横扫NLP领域的今天,回望2014年提出的加性注意力机制(Additive Attention),犹如在摩天大楼顶端俯瞰地基。这个由Bahdanau在神经机器翻译中首次提…...
在Hermes Agent中自定义Provider接入Taotoken服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Hermes Agent中自定义Provider接入Taotoken服务 对于使用Hermes Agent进行AI应用开发的团队而言,能够灵活接入不同的…...
