如何在Node.js+Express+Mongoose中接收正则表达式查询参数
通过参数实现Mongoose正则表达式查询
作为Node.js、Express、Mongoose新手,我想实现通过传入正则表达式参数来查询并返回匹配的文档(已知直接传未处理的输入有风险,仅做尝试)。
硬编码正则查询可行
直接在代码里写正则表达式可以正常查询:
const result = await Model.find( { name : /Dave/ } );
这段代码能正确返回数据库中name字段为Dave的文档。
传入参数时出现报错
尝试通过Postman向localhost:8080/query发送POST请求,请求体传入myQuery: { name: /Dave/ },路由代码如下:
var query = req.body.myQuery const result = await Model.find(query);
此时收到报错:
"Parameter \"filter\" to find() must be an object, got { name : /Dave/ }"
问题原因
HTTP请求体中的/Dave/会被解析为字符串,而非JavaScript的RegExp对象,Mongoose无法将其识别为有效的查询条件,因此报错。
解决方案(仅供参考,不够严谨)
我通过拆分参数的方式解决了问题,具体参数说明:
mmField:指定要搜索的字段,例如LastnamemmRegex:指定要匹配的目标字符串,例如JohnsonmmRegexOp:正则表达式选项,例如i(忽略大小写)或留空
路由实现代码:
router.post('/mmRegex', async (req, res) => { try { const map = new Map([[ req.body.mmField , new RegExp(req.body.mmRegex, req.body.mmRegexOp)]]); const query = Object.fromEntries(map); console.log("RegEx: ", query); const result = await Model.find(query).select('mmKey'); res.send(result); } catch (error) { console.log("No Key"); res.status(500).json({ status: "failed", message: error.message }) } });
内容的提问来源于stack exchange,提问作者entropywrench
相关产品推荐
相关产品推荐

