当前位置: 首页 > ds >正文

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.xdnf.cn/news/17287.html

相关文章:

  • 嵌入式学习---在 Linux 下的 C 语言学习 Day9
  • 《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解
  • 基于单片机GD32E103的HID按键问题分析
  • 日常反思总结
  • electron:vue3+vite打包案例
  • Spring Cloud系列—Eureka服务注册/发现
  • CSS高频属性速查指南
  • 【普通地质学】地球的物质组成
  • Windows 如何上架 iOS 应用?签名上传全流程 + 工具推荐
  • LeetCode——118. 杨辉三角
  • 【Git】修改本地和远程的分支名称
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘chainer’问题
  • 基于AI的自动驾驶汽车(AI-AV)网络安全威胁缓解框架
  • Adobe Analytics 数据分析平台|全渠道客户行为分析与体验优化
  • 【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
  • 开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话
  • 【java】DDD架构同普通微服务项目的区别
  • DAY 36 复习日
  • MinIO01-入门
  • ara::log::LogStream::WithTag的概念和使用案例
  • Patsy的dmatrix() 函数
  • 利用m0改造循迹模块处理笔记00
  • 智慧酒店:科技赋能下的未来住宿新体验
  • 人工智能领域、图欧科技、IMYAI智能助手2025年7月更新月报
  • RabbitMQ延时队列的两种实现方式
  • NLP自然语言处理 03 Transformer架构
  • 数据集相关类代码回顾理解 | sns.distplot\%matplotlib inline\sns.scatterplot
  • 翻译的本质:人工翻译vs机器翻译的核心差异与互补性
  • 自然语言处理×第三卷:文本数据分析——她不再只是贴着你听,而开始学会分析你语言的结构
  • 最长连续序列(每天刷力扣hot100系列)