Node.js- express的基本使用

Express 核心概念​

Express是基于Node.js的轻量级Web框架,封装了HTTP服务、路由管理、中间件等核心功能,简化了Web应用和API开发
核心优势​​

  • 中间件架构:支持模块化请求处理流程
  • 路由系统:直观的URL到处理函数的映射
  • 高性能:非阻塞I/O模型与事件驱动机制
基础使用​
  • 安装express
npm init
npm i express
  • 快速入门
// index.js
const express = require('express');
const port = 3000;
const app = express();app.get('/a',(req,res)=>{res.send("Welcome to a Page");
})app.listen(port,()=>{console.log("Server is running on port 3000"); 
})
//执行
// node index.js
// nodemon index.js
// npm run start //package.json中配置
  • 浏览器访问
    在这里插入图片描述
express 路由

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

  • 路由使用
const express = require('express');
const app = express();// GET 路由
app.get('/home', (req, res) => {res.send('网站首页');
});// 根路由
app.get('/', (req, res) => {res.send('首页');
});// POST 路由
app.post('/login', (req, res) => {res.send('登录成功');
});
// 路径参数(规范写法)
app.get('/users/:userId', (req, res) => {res.send(`User ID: ${req.params.userId}`); 
});// 全方法路由
app.all('/search', (req, res) => {res.send('1秒钟为您找到相关结果约100,000,000个');
});// 多方法路由链
app.route('/books').get((req, res) => res.send('Get Books')).post((req, res) => res.send('Add Book'));// 404 路由
app.all('*', (req, res) => {res.send('<h1>404 Not Found</h1>');
});app.listen(3000);

在这里插入图片描述

注意:​
路由路径语法冲突​​app.all(':page(.)')中的 (.)被解析为正则表达式,但 ​​path-to-regexp要求正则部分必须用 /包裹​​。当前写法 :page(.*)会被解析为:

  • :page→ 命名参数
  • (.*)→ 未闭合的正则片段(缺少起始 /),触发语法错误 Unexpected
获取请求参数
app.get('/request', (req, res) => {// 获取报文的方式与原生 HTTP 获取方式是兼容的console.log(req.method); // GETconsole.log(req.url); // /requestconsole.log(req.httpVersion); // 1.1console.log(req.headers); // 请求头// / express 独有的获取报文的方式console.log(req.query); // 查询字符串console.log(req.get('host')); // 获取指定的请求头res.send('请求报文的获取');
});// 路径参数
app.get('/users/:userId', (req, res) => {res.send(`User ID: ${req.params.userId}`); 
});
express 响应设置
app.get("/response", (req, res) => {// 原生HTTP方式res.statusCode = 404;res.statusMessage = 'Not Found';res.setHeader('abc', 'xyz');res.write('响应体');res.end('结束');// Express方式res.status(500); // 状态码res.set('xxx', 'yyy'); // 响应头res.send('中文响应不乱码'); // 响应体// 链式调用res.status(404).set('xxx', 'yyy').send('你好朋友');// 其他响应res.redirect('http://example.com'); // 重定向res.download('./package.json'); // 文件下载res.json({name: 'John'}); // JSON响应res.sendFile(__dirname + '/home.html'); // 发送文件
});

注意:出现乱码的情况

  • 响应体中出现乱码
    • 响应头中设置 Content-Type: text/plain; charset=utf-8
  res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8' // 明确指定 UTF-8});res.write('响应体');res.end('结束');
express 中间件

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

  • 全局中间件
// 定义中间件
const logger = (req, res, next) => {console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);next();
};// 应用中间件
app.use(logger);// 多个全局中间件
app.use((req, res, next) => {console.log('中间件1');next();
});app.use((req, res, next) => {console.log('中间件2');next();
});
  • 路由中间件
// 路由中间件(身份验证)
const authMiddleware = (req, res, next) => {if (req.query.token === '123') next();else res.status(401).send('Unauthorized');
};
const logMiddleware = (req, res, next) => {console.log('日志记录');next(); 
}
// 单个中间件
app.get('/admin', authMiddleware, (req, res) => {res.send('管理员页面--');
});// 多个中间件
app.get('/dashboard', authMiddleware, logMiddleware, (req, res) => {res.send('控制面板--');}
);
  • 静态资源中间件
// public目录作为静态资源根目录
app.use(express.static('./public')); // 动态路由(注意顺序问题)
app.get('/index.html', (req, res) => {res.send('动态首页');
});
  • 关键内置中间件​
// 解析请求体(JSON)
app.use(express.json());// 解析请求体(表单数据)
app.use(express.urlencoded({ extended: true }));// 解析Cookie
app.use(cookieParser());
// 解析Session(需要额外配置)
app.use(session({ secret: 'secret', resave: false, saveUninitialized: true }));// 托管静态资源(public目录)
app.use(express.static('public'));
  • 请求体解析中间件
npm i body-parserconst bodyParser = require('body-parser');// 处理表单数据
app.use(bodyParser.urlencoded({ extended: false }));// 处理JSON数据
app.use(bodyParser.json());app.post('/login', (req, res) => {console.log(req.body.username);console.log(req.body.password);res.send('登录成功');
});
Router 路由模块化
  • 创建路由模块
//routes/userRouter.js
const express = require('express');
const router = express.Router();router.get('/', (req, res) => {res.send('用户首页');
});router.get('/list', (req, res) => {res.send('用户列表');});router.get('/:id', (req, res) => {res.send(`用户详情: ${req.params.id}`);
});module.exports = router;
  • 主文件使用路由
const express = require('express');
const app = express();
const userRouter = require('./routes/userRouter');app.use('/users', userRouter);app.listen(3000);// 返回地址:
//  http://localhost:3000/users/   -> 用户首页
//  http://localhost:3000/users/list   -> 用户列表
//  http://localhost:3000/users/11 -> 用户详情: 11

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

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

相关文章

计算机网络:网络号和网络地址的区别

在计算机网络中&#xff0c;“网络号”和“网络地址”是两个密切相关但含义不同的概念&#xff0c;主要用于IP地址的划分和网络标识。以下从定义、作用、关联与区别等方面详细说明&#xff1a; 1. 网络号&#xff08;Network Number&#xff09;定义&#xff1a;网络号是IP地址…

【iOS】3GShare仿写

【iOS】3GShare仿写 文章目录【iOS】3GShare仿写登陆注册界面主页搜索文章活动我的总结登陆注册界面 这个界面的ui东西不多&#xff0c;主要就是几个输入框及对输入内容的一些判断 登陆界面 //这里设置了一个初始密码并储存到NSUserDefaults中 NSUserDefaults *defaults [N…

从案例学习cuda编程——线程模型和显存模型

1. cuda介绍CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;是NVIDIA推出的一种并行计算平台和编程模型。它允许开发者利用NVIDIA GPU的强大计算能力来加速计算密集型任务。CUDA通过提供一套专门的API和编程接口&#xff0c;使得…

进阶向:YOLOv11模型轻量化

YOLOv11模型轻量化详解:从理论到实践 引言 YOLO(You Only Look Once)系列模型因其高效的实时检测能力而广受欢迎。YOLOv11作为该系列的最新演进版本,在精度和速度上均有显著提升。然而,原始模型对计算资源的需求较高,难以在边缘设备或移动端部署。轻量化技术通过减少模…

2025-08 安卓开发面试拷打记录(面试题)

想跑路了&#xff0c;开始学八股&#xff0c;几个主动找的大厂试了下水&#xff0c;后续看情况更新。楼主一年经验&#xff0c;学的c被骗来干安卓&#xff0c;双非本科。2025-07-31 小鹏汇天 安卓开发一面synchronizedhandler视图刷新binderjvm垃圾回收内存泄漏排查glide缓…

风丘助力混合动力汽车工况测试:精准采集整车信号解决方案

一、背景 混合动力汽车是介于纯电动汽车与燃油汽车两者之间的一种新能源汽车。它既包含纯电动汽车无污染、启动快的优势&#xff0c;又拥有燃油车续航便捷、不受电池容量限制的特点。在当前环境下&#xff0c;混合动力汽车比纯电动汽车更符合目前的市场需求。 然而&#xff…

​​MCU程序的存储方式与存储区域大小要求​

程序的段的存储方式与存储区域大小要求 程序的存储和运行涉及 ROM&#xff08;Flash/非易失性存储器&#xff09; 和 RAM&#xff08;易失性存储器&#xff09; 的分配&#xff0c;不同段在存储和运行时具有不同的特性。以下是详细的分类和计算方式&#xff1a;1. 程序文件的存…

Lesson 31 Success story

Lesson 31 Success story 词汇 retire v.退休,退役[运动]去睡觉 构成:re-表示重复 tire v.感到累一tried a.累的 tyre n.轮胎 用法:retire from 单位 从…退休(过去时) 例句:他从学校退休了。 He retired from our school. retire例句: 1.他越来越老了&#xff0c;他即將退休。…

2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技

2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技 鲸鱼小说分销系统介绍 优雅草私鱼创作系统——产品介绍 系统概述 优雅草私鱼创作系统&#xff08;简称“私鱼”&#xff09;是一款专注于私域流量运营的垂直化…

鹧鸪云:光伏电站的“智慧中枢”,精准调控逆变器

光伏电站如星辰散落于大地&#xff0c;那些默默工作的逆变器便是每一处光芒的关键心脏。然而&#xff0c;分布广袤、设备众多&#xff0c;传统运维如盲人摸象&#xff0c;效率低下&#xff0c;故障难寻&#xff0c;白白流失宝贵电能。鹧鸪云光伏运维软件应时而生&#xff0c;它…

java中Reflection反射(一)

目录 一、概述 二、class类&#xff1a; 1、获取类的字节码文件&#xff1a; &#xff08;1&#xff09;方式一&#xff1a;直接通过一个class的静态变量class获取 &#xff08;2&#xff09;方式二&#xff1a;如果知道一个class的完整类名&#xff0c;可以通过静态方法Cl…

CVE-2021-1879

一、漏洞原理 CVE-2021-1879 是 IBM WebSphere Application Server 中存在的一个 路径遍历&#xff08;Path Traversal&#xff09; 漏洞&#xff0c;其核心原理为&#xff1a; ①WebSphere 在处理某些文件操作请求&#xff08;如下载、上传或配置文件读取&#xff09;时&#…

二进制签名查找器(Aho-Corasick 自动机):设计思路与实现原理(C/C++代码实现)

在逆向工程、恶意软件分析和二进制文件解析领域&#xff0c;快速准确地识别特定字节模式&#xff08;即“签名”&#xff09;是一项核心任务。本文将围绕一款基于PE-bear工具的二进制签名查找器&#xff0c;深入解析其设计思路、实现原理及相关技术背景&#xff0c;揭示其如何高…

後端開發技術教學(二) 條件指令、循環結構、定義函數

書接上回&#xff1a;後端開發技術教學(一) [附2025最新可用 phpstudy2018下載鏈接] -CSDN博客 必要資源&#xff1a; trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一键部署 PHP 开发环境 小皮出品 目录 一、條件指令 1.1 if() …

状压DP-基本框架

状压DP-基本框架一、状压DP的核心思想与适用场景1.1 问题特征1.2 核心思想1.3 与传统DP的对比二、位运算基础&#xff1a;状压DP的语法三、状压DP的基本框架3.1 步骤拆解3.2 通用代码模板四、经典案例详解4.1 旅行商问题&#xff08;TSP&#xff09;问题描述状压DP设计代码实现…

Web 端 AI 图像生成技术的应用与创新:虚拟背景与创意图像合成

随着 Stable Diffusion、Midjourney 等生成式 AI 模型的爆发,Web 端图像生成技术从“实验室demo”走向“工业化应用”。其中,虚拟背景替换(如视频会议的动态背景生成)和创意图像合成(如用户上传素材与 AI 生成元素的融合)成为最具代表性的场景,它们通过“文本描述→AI 生…

应急响应知识总结

应急响应 Windows系统 查账号 1、查看服务器是否有弱口令&#xff0c;远程管理端口是否对公网开放。 检查方法&#xff1a;据实际情况咨询相关服务器管理员。 2、查看服务器是否存在可疑账号、新增账号。 检查方法&#xff1a;打开 cmd 窗口&#xff0c;输入 lusrmgr.msc …

智慧水务赋能二次供水管理精细化转型:物联网驱动的全链路解决方案

随着我国城镇化率激增&#xff0c;高层建筑占比上升&#xff0c;二次供水系统已成为保障城市供水安全的核心环节。然而&#xff0c;传统管理模式面临设备老化、运维粗放、监管缺失等矛盾&#xff0c;在此背景下&#xff0c;《“十四五”节水型社会建设规划》明确要求推进二次供…

tsmc 5nm lvs之 short难搞的类型

1、M3层以上的层次发生的short&#xff0c;dengsity很高的情况下&#xff0c;两根信号net导致的short&#xff0c;删除其中一根然后ecoRoute fix不掉的情况下&#xff0c;该怎么办&#xff0c;可以尝试去cut 周围或者上方的power。 2、M1&#xff0c; M2由于cell 内部出pin&…

初识神经网络01——认识PyTorch

文章目录一、认识PyTorch1.1 PyTorch是什么1.2 安装PyTorch二、认识Tensor2.1 创建Tensor2.1.1 基本方式2.2.2 创建线性和随机张量2.2 Tensor属性2.2.1 切换设备2.2.2 类型转换2.3 Tensor与Numpy的数据转换2.3.1 张量转ndarray2.3.2 Numpy转张量2.4 Tensor常见操作2.4.1 取值2.…