如何将Node-Express接口的URL过滤器转为MongoDB正则查询?
问题:Node-Express接口中MongoDB正则表达式过滤器无法生效
我有一个Node-Express接口,接收多个URL参数作为过滤器,示例请求如下:
{{baseUrl}}/projects?page=1&name=myProject
请求随后会转换为MongoDB查询。
模型定义
const projectSchema = mongoose.Schema({ name: { type: String, required: true, }, users: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], }); const Project = mongoose.model('Project', projectSchema);
当前处理代码
const filter = pick(req.query, ['name']); const options = pick(req.query, ['sortBy', 'limit', 'page']); options.populate = 'users'; const result = await projectService.queryProjects(filter, options, req.user);
正常情况下该逻辑运行良好,但当使用/MyProject/这类MongoDB过滤表达式时,过滤器会被当作字符串而非正则表达式传入。
当前输出
// current result console.log(filter); // Output: { name: '/MyProject/' }
期望输出
// expected result const test = { name: /MyProject/ }; console.log(test); // Output { name: /MyProject/ }
请问需要修改什么才能得到预期结果?
解决方案
需要对提取到的name参数做格式判断,将符合正则表达式格式的字符串转换为真正的正则对象,修改后的代码如下:
基础版本(支持基础正则)
const filter = pick(req.query, ['name']); // 处理name参数为正则表达式 if (filter.name && typeof filter.name === 'string' && /^\/.+\/$/.test(filter.name)) { const regexContent = filter.name.slice(1, -1); filter.name = new RegExp(regexContent); } const options = pick(req.query, ['sortBy', 'limit', 'page']); options.populate = 'users'; const result = await projectService.queryProjects(filter, options, req.user);
进阶版本(支持正则修饰符)
如果需要支持正则修饰符(如大小写不敏感/MyProject/i),可以扩展逻辑提取修饰符:
const filter = pick(req.query, ['name']); // 处理带修饰符的正则表达式 if (filter.name && typeof filter.name === 'string') { const regexMatch = filter.name.match(/^\/(.+)\/([gimsuy]*)$/); if (regexMatch) { const [, pattern, flags] = regexMatch; filter.name = new RegExp(pattern, flags); } } const options = pick(req.query, ['sortBy', 'limit', 'page']); options.populate = 'users'; const result = await projectService.queryProjects(filter, options, req.user);
说明
- 基础版本会检查
name参数是否以/开头和结尾,若是则提取中间内容创建正则对象。 - 进阶版本额外支持提取正则修饰符(如
g全局匹配、i忽略大小写等),适配更复杂的查询需求。
内容的提问来源于stack exchange,提问作者Jens Kock
相关产品推荐
相关产品推荐

