第3篇:请求参数处理与数据校验

在 Web 开发中,请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案,涵盖常规参数获取、高效校验方案、文件流处理等核心功能,并分享企业级项目中的最佳实践。

在这里插入图片描述


一、多场景参数获取策略

1. Query 参数处理

适用于 URL 中的查询参数,通过 ctx.query 直接获取:

// GET /api/users?type=admin&page=2
async list() {const { ctx } = this;const { type = 'user', page = 1 } = ctx.query;ctx.body = await ctx.service.user.list({type: type.trim(),page: Number(page)});
}

注意点

  • 自动完成 URL decoding
  • 参数值始终为字符串类型
  • 使用解构设置默认值

2. Params 路由参数

通过路由占位符获取参数:

// router.js
router.get('/api/users/:id', controller.user.show);// controller
async show() {const { ctx } = this;const user = await ctx.service.user.find(ctx.params.id);if (!user) {ctx.throw(404, '用户不存在');}ctx.body = user;
}

3. Body 请求体处理

处理 POST/PUT 请求的请求体数据:

// config/config.default.js
exports.bodyParser = {jsonLimit: '10mb',formLimit: '10mb'
};// controller
async create() {const { ctx } = this;const { name, email } = ctx.request.body;const user = await ctx.service.user.create({name: ctx.helper.escape(name),email: email.toLowerCase()});ctx.body = user;
}

安全建议

  • 始终对用户输入进行转义处理
  • 使用 ctx.validate() 验证请求类型
  • 敏感字段需二次验证

二、数据校验强化方案

1. 安装与配置校验插件

$ npm install egg-validate --save
// config/plugin.js
exports.validate = {enable: true,package: 'egg-validate'
};

2. 基础校验实践

async create() {const { ctx } = this;ctx.validate({username: { type: 'string', required: true },password: { type: 'password', compare: 're_password' },email: { type: 'email', allowEmpty: true },age: { type: 'number', min: 18, max: 60 }});// 业务逻辑
}

3. 校验规则扩展

支持以下校验类型:

  • 基础类型:string, number, int, float
  • 格式验证:email, url, ip
  • 特殊规则:date, datetime, enum
  • 复杂校验:object, array

4. 扩展校验规则

// app.js
app.validator.addRule('mobile', (rule, value) => {const regex = /^1[3-9]\d{9}$/;if (!regex.test(value)) {return '手机号格式错误';}
});// 使用自定义规则
ctx.validate({phone: { type: 'mobile', required: true }
});

5. 统一错误处理

// app/middleware/error_handler.js
module.exports = () => async (ctx, next) => {try {await next();} catch (err) {ctx.status = err.status || 500;ctx.body = {code: ctx.status,message: err.message,details: err.errors || []};}
};// config/config.default.js
config.middleware = ['errorHandler'];

三、文件上传进阶技巧

1. 基础文件上传

// config/config.default.js
exports.multipart = {mode: 'file',fileSize: '50mb',whitelist: ['.png', '.jpg', '.gif']// whitelist也可以配置为如下方式fileExtensions: [".png", ".jpg", ".gif"]
};// app/controller
async upload() {const { ctx } = this;const stream = await ctx.getFileStream();ctx.body = await ctx.service.upload.save(stream);
}// app/service
const sendToWormhole = require('stream-wormhole');async save(stream, obj) {const { ctx } = this;try {// 创建上传目录const uploadDir = this.createUploadDir();// 生成唯一文件名const filename = `${crypto.randomUUID()}${path.extname(stream.filename)}`;const target = path.join(uploadDir, filename);// 写入文件const writeStream = fs.createWriteStream(target);stream.pipe(writeStream);// 等待写入完成await new Promise((resolve, reject) => {writeStream.on('finish', resolve);writeStream.on('error', reject);});// 返回结果return {code: 200,data: {originalName: stream.filename,fileName: filename,size: stream.bytesRead,url: `/files/${filename}`,formData: stream.fields // 其他表单字段}};} catch (err) {// 销毁未消费的流await sendToWormhole(stream);ctx.throw(500, `文件上传失败: ${err.message}`);}
}// 创建上传目录(按日期分类)
createUploadDir() {const dir = path.join(this.app.config.baseDir,'app/public/uploads',dayjs().format('YYYY-MM-DD'));if (!fs.existsSync(dir)) {fs.mkdirSync(dir, { recursive: true });}return dir;
}

2. 大文件流式处理

const sendToWormhole = require('stream-wormhole');async upload() {const stream = await ctx.getFileStream();try {// 上传到云存储const result = await cloudStorage.upload(stream);return { url: result.url };} catch (err) {// 销毁未消费的流await sendToWormhole(stream);ctx.throw(500, '上传失败');}
}

3. 文件错误处理中间件

app/middleware/error_handler.jsmodule.exports = () => async (ctx, next) => {try {await next();} catch (err) {if (err.code === 'LIMIT_FILE_SIZE') {ctx.status = 413;ctx.body = { error: '文件大小超过限制' };} else if (err.code === 'INVALID_FILE_TYPE') {ctx.status = 415;ctx.body = { error: '不支持的文件类型' };} else {ctx.status = err.status || 500;ctx.body = { error: err.message };}}
};

性能优化建议

  • 使用管道(pipe)处理流数据
  • 限制并发上传数量
  • 实现断点续传功能

最佳实践总结

  1. 始终优先校验后处理原则
  2. 防御性编码应对异常输入
  3. 敏感操作使用二次验证
  4. 日志记录关键参数处理过程
  5. 定期审计参数处理代码

下篇预告:服务层抽象与复用逻辑

在下一篇中,我们将深入探讨:

  • Service层的职责与依赖注入
  • 业务逻辑封装与复用模式
  • 事务处理与数据库操作封装
  • 服务单元测试策略

核心价值:通过合理的抽象设计,提升代码复用率 300%,降低维护成本 50%!


通过本文的实践方案,可有效提升接口健壮性,降低安全风险 80% 以上。建议结合项目需求选择合适的校验策略,并建立统一的参数处理规范。欢迎在评论区留下你遇见的「参数传递与校验」设计经验与挑战,共同探讨最佳实践!

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

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

相关文章

2025年-redis(p1-p10)

1.redis介绍 (1)基础:常见的数据结构及命令、jedis的应用和优化、springDataRedis的应用和优化 (2)企业实战的应用场景:共享session、缓存解决问题、秒杀中的redis应用、社交app中的redis应用、redis特殊结…

【AI模型学习】GPT——从v1到v3

文章目录 GPT-1GPT vs BERTGPT-2GPT-3Ai代码 GPT-1 GPT-1(Generative Pretrained Transformer 1)是 OpenAI 在2018年发布的第一个大规模预训练生成模型。它开创了基于 Transformer 的 预训练-微调 (pretraining-finetuning) 框架,在自然语言…

数字智慧方案6178丨智慧医院医疗信息化建设之以评促建(61页PPT)(文末有下载方式)

资料解读:智慧医院医疗信息化建设之以评促建 详细资料请看本解读文章的最后内容。 在当今数字化时代,医疗行业正经历着深刻变革,智慧医院的建设成为提升医疗服务质量、优化医疗资源配置的关键所在。这份智慧医院医疗信息化建设之以评促建的资…

浅谈C# record关键字

环境:.net8控制台 init关键字 通常我们会有一个常见的需求就是需要实现一个实例化后不可变的类型. 我通常会如下实现,将类的属性的set设为私有,这样只能使用构造函数来实例一个不可变对象. 但是如果内部再声明一个public的方法还是有可能会将我这个对象改变. internal class…

实时数仓dim层设计的一些疑惑点

0.dim层组件的选择 dim层存储要求:需要满足永久存储(需要长期保存历史数据)和支持根据主键查询单条数据明细,所以排除Kafka(时效短); 候选框架:MySQL、Redis、Hive、Doris、HBase …

模型之FIM(Fill-In-the-Middle)补全

文章目录 模型之FIM(Fill-In-the-Middle)补全什么是FIM(Fill-In-the-Middle)FIM 的工作原理FIM 示例:代码补全场景常见模型fim 测试deepseek fim阿里completions 接口要判断模型是否支持特定的特殊标记**1. 模型可以自动推断生成区域****2. `suffix` 是可选的****3. 模型的…

使用CubeMX新建DMA工程——存储器到外设模式

目录 1、新建板级支持包 1、usart.c: 2、修改的地方:在usart.c中添加了这些 3、usart.h: 4、在usart.h中添加了这些: 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加头文件 2、添加外部变量声明 3、添加简单延时函数 4、添加…

el-transfer穿梭框数据量过大的解决方案

一:背景 我们这个穿梭框获取的是项目的全量数据,在左边大概有5000条,自己测试了一下5000条数据的效果,发现异常的卡顿,本来打算像el-select一样去解决的(只显示一部分,在搜索的时候去全量搜索&a…

2025年- H17-Lc125-73.矩阵置零(矩阵)---java版

1.题目描述 2.思路 (1)计算矩阵的行数 (2)计算矩阵的列数 (3)设计一个行列的bool数组 (4)遍历矩阵(二维数组),如果遇到元素0,则把…

Qt二维码demo

使用QZXing库生成的二维码demo 运行结果 实现代码 c文件 #include "mainwindow.h" #include "ui_mainwindow.h" #include "src/myqrcodeheader.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-&…

怪物猎人:世界-冰原10000+mod整合包5月最新更新!

700A大全套精美服装 800M大全套精美服装 3月31日更新 新增 新武器 新特效MOD 当前共计5800MOD整合包 好看的发型mod 实用的功能mod 炫酷的武器mod 新服装新特效新武器实用模组美化,等。 1月14日更新 新增皮肤MOD 500 当前共计2000MOD 1月16日更新 新增超…

华纳云:centos如何实现JSP页面的动态加载

JSP(JavaServer Pages)作为Java生态中常用的服务器端网页技术,具有动态内容生成、可扩展性强、与Java无缝结合等优势。 而CentOS作为一款稳定、高效、安全的Linux服务器操作系统,非常适合部署JSP应用。 想要让JSP页面实现动态更新加载,避免…

gradle-tasks.register(‘classesJar‘, Jar)解析

在使用gradle作为构建工具的android或者java web项目中,我们经常能遇到以下格式 tasks.register(classesJar, Jar) {from "$buildDir/intermediates/javac/release/classes" // 假设使用 release 构建变体 }artifact sourcesJar使用伪代码解释 class Cu…

数据处理1

一、常用数据处理模块Numpy Numpy常用于高性能计算,在机器学习常常作为传递数据的容器。提供了两种基本对象:ndarray、ufunc。 ndarray具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 ufunc提供了对数组快速运算的标准数学函数。 ndar…

电力市场的交易品种

双边交易(Bilateral Trading) 定义:是电力市场中最基本的交易方式之一,指具备市场交易资格的买方和卖方,通过自主协商、双边协商的形式,确定交易电量、交易价格、交割曲线等交易要素,并签订中长…

uniapp 实现时分秒 分别倒计时

效果 <view class"issue-price-countdown"> <CountDown :endTimestamp"1745996085000"></CountDown> </view> 引入组件 import CountDown from /components/CountDown.vue; <template> <view class&qu…

从CRUD到复杂业务:AI自动生成电商优惠券叠加逻辑(新手救星指南)

在 Java 编程的广阔天地中,据统计,高达 80% 的新手会在业务逻辑编写环节陷入困境。业务逻辑作为软件系统的核心灵魂,承载着从用户需求到代码实现的关键转化过程,为何却成为新手难以逾越的 “鸿沟”?飞算 JavaAI 的出现,又将如何打破这一僵局? 一、Java 新手卡在业务逻辑的根…

23页PDF | 数据治理实施方案 :规划、执行、评价、改进四步走的管控模式

在当今数字化时代&#xff0c;数据已经成为企业和组织的核心资产之一。然而&#xff0c;随着数据量的不断增长和数据来源的日益多样化&#xff0c;数据治理变得愈发重要。有效的数据治理能够确保数据的质量、安全和合规性&#xff0c;提升数据的价值和利用效率。那么&#xff0…

curl详解

curl 是一个常用的命令行工具&#xff0c;用于发送 HTTP 请求&#xff0c;支持包括 GET、POST、PUT、DELETE 等在内的多种 HTTP 方法。它非常适合用来测试 API、下载文件、与后端服务进行交互等。接下来&#xff0c;我会详细讲解 curl 的基本用法以及常见的应用场景。 &#x…

Win11安装Ubuntu20.04简记

写在前面 之前装的22.04&#xff0c;不稳定&#xff0c;把22.04卸载了&#xff0c;重新安装20.04系统。这里主要把卸载和安装的过程中参考到的博客在这记录一下。 卸载ubuntu系统参考的博文 卸载参考博文1 卸载参考博文2 Ubuntu20.04安装参考博文 安装参考博文1 安装参考博…