Sails.js升级至v1后如何恢复不区分大小写的查询?
解决Sails.js v1 MongoDB环境查询大小写不敏感的方案
我之前也碰到过这个问题,给你几个实用的解决方案,针对MongoDB环境完全适用:
全局中间件统一转换请求参数大小写
你可以在config/http.js里添加一个自定义中间件,把所有请求的查询参数、表单参数统一转成小写(或者大写),这样不管用户传什么大小写的参数,后端都用统一格式去查询。示例代码:// config/http.js module.exports.http = { middleware: { order: [ 'convertParamsCase', // 把这个放在中间件队列的前面 'cookieParser', 'session', // ...其他原有中间件 ], convertParamsCase: function(req, res, next) { // 处理URL查询参数 if (req.query) { Object.keys(req.query).forEach(key => { const lowerKey = key.toLowerCase(); if (lowerKey !== key) { req.query[lowerKey] = req.query[key]; delete req.query[key]; } }); } // 处理请求体参数(需配合body-parser使用) if (req.body) { Object.keys(req.body).forEach(key => { const lowerKey = key.toLowerCase(); if (lowerKey !== key) { req.body[lowerKey] = req.body[key]; delete req.body[key]; } }); } next(); } } };这个方法能从请求入口统一处理,不用逐个修改控制器代码,适合全局需要兼容的场景。
封装模型查询方法,实现大小写不敏感查询
如果不想全局修改,也可以针对特定模型封装自定义查询方法,利用MongoDB的$regex语法配合$options: 'i'实现不区分大小写匹配:// api/models/YourModel.js module.exports = { attributes: { // 你的模型属性定义 username: { type: 'string', required: true } }, // 自定义大小写不敏感查询方法 findCaseInsensitive: function(params) { const caseInsensitiveParams = {}; Object.keys(params).forEach(key => { // 仅对字符串类型字段做大小写处理 if (typeof params[key] === 'string') { caseInsensitiveParams[key] = { $regex: new RegExp(`^${params[key]}$`, 'i') }; } else { caseInsensitiveParams[key] = params[key]; } }); return this.find(caseInsensitiveParams); } };之后在控制器里直接调用
YourModel.findCaseInsensitive({ username: req.param('username') })即可。代码里的^和$是为了实现精确匹配,若需要模糊匹配可以去掉这两个符号。MongoDB不区分大小写索引(生产环境推荐)
如果你担心正则查询的性能问题(尤其是数据量较大时),可以给需要查询的字段创建不区分大小写的索引,利用索引提升查询效率。在Sails模型中可以这样配置:// api/models/YourModel.js module.exports = { attributes: { username: { type: 'string', required: true } }, indexes: [ { keys: { username: 1 }, options: { collation: { locale: 'en', strength: 2 } } } ] };查询时需要指定对应的collation规则:
YourModel.find({ username: req.param('username') }) .meta({ collation: { locale: 'en', strength: 2 } }) .exec((err, records) => { // 处理查询结果 });这里的
strength: 2表示忽略大小写且不区分重音字符,你可以根据业务需求调整参数值。
需要注意的是,Sails.js v1默认开启参数大小写敏感是为了对齐MongoDB的原生行为,上面的方案都是在不破坏框架原有逻辑的前提下做兼容处理,你可以根据自己的业务场景选择最适合的方式。
内容的提问来源于stack exchange,提问作者agonza1
相关产品推荐
相关产品推荐

