ExpressJS中解析Axios URL参数为字符串数组及校验方法
URL参数解析方法
默认情况下,Express 框架自带的查询字符串解析能力(基于qs库)可以自动识别query[]=xxx&query[]=yyy格式的数组参数,不需要额外写解析逻辑。
当请求路径为/endpoint?query[]=max&query[]=kevin时,直接读取req.query.query就能得到标准的JavaScript字符串数组['max', 'kevin']。即使数组只有1个元素,qs也会正确识别为数组类型,不会出现单元素被解析为字符串的问题。
如果你手动修改过Express的query parser配置为simple模式(基于Node原生querystring模块),解析结果会把带方括号的参数名作为完整key,这时候可以用如下代码手动兼容:
const rawQuery = req.query['query[]']; const queryArr = Array.isArray(rawQuery) ? rawQuery : rawQuery ? [rawQuery] : [];
日常使用建议保持Express默认的query parser配置,减少额外兼容成本。
express-validator 校验实现
校验逻辑需要覆盖参数存在性、类型校验、数组元素类型校验三个核心点,参考实现如下:
const express = require('express'); const { query, validationResult } = require('express-validator'); const app = express(); // 保持默认query parser配置即可,无需额外修改 app.get('/endpoint', [ query('query') .exists({ checkFalsy: true }) .withMessage('query参数不能为空') .isArray({ min: 1 }) .withMessage('query必须为非空数组') // 校验数组所有元素均为字符串 .custom((val) => { const allString = val.every(item => typeof item === 'string'); if (!allString) throw new Error('query数组的每一项都必须是字符串类型'); return true; }) // 可选:按需追加数组元素的规则校验,比如长度限制、字符白名单等 .custom((val) => { const validLength = val.every(item => item.length >= 1 && item.length <= 30); if (!validLength) throw new Error('query数组项长度需在1-30个字符之间'); return true; }) ], (req, res) => { // 统一处理校验错误 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ code: 400, errors: errors.array() }); } // 直接取解析好的数组使用即可 const queryList = req.query.query; res.json({ code: 0, data: queryList }); }); app.listen(3000);
注意不要在校验规则里写query('query[]'),默认qs解析后参数的方括号后缀会被移除,直接校验query字段即可。
内容的提问来源于stack exchange,提问作者Grifting
相关产品推荐
相关产品推荐

