我已经在NodeJS中使用Express创建了一个API,它使用NeDB作为它的数据库。
我已经检查了文档,我可以看到有一种方法可以使用正则表达式过滤结果,以便执行类似于SQL中的"like“操作。
当创建一个硬编码的JSON对象作为过滤器时,我可以让正则表达式工作,但是当过滤器通过我的API传递时,NeDB报告以下错误:
Error: $regex operator called with non regular expression
我的测试数据库包含以下文档:
[
{
"test": "Hello",
"other": "Goodbye",
"_id": "9T0WaZ240q6ZK747"
},
{
"test": "sup!",
"other": "Ta ta",
"extra": "something",
"_id": "jLUzEZjLDVX1lmU5"
}
]当我使用硬编码的JSON过滤器对数据执行find()时,它将返回正确的结果,例如
{
test: {
$regex: /hell/i
}
}将返回数据库中的第一条记录。
但是,当我从我的应用程序接口调用find()函数时,我收到了前面提到的错误。
我的API中添加的过滤器如下所示:
{ test: { '$regex': '/hell/i' } }
看起来可能是单引号导致了一些问题,但即使在去掉它们之后,它也不起作用。我要么得到相同的错误,要么得到其他一些JSON解析错误。
我检查了NeDB的代码,并在model.js文件中添加了一行代码,以便将检测到的正则表达式输出到控制台。在这两种情况下(工作的硬编码方法和API方法),正则表达式被返回为:
/hell/i
因此,看起来NeDB为两个调用接收了相同的表达式,但是由于某种原因,它抛出了一个错误。
是否有人尝试过使用find()方法将JSON过滤器传递给NeDB实例并成功过滤?
我正在使用Postman进行API测试。
发布于 2019-04-12 22:41:37
我现在已经想出了一种解决方案。这绝不是完美的,仍然需要更多的工作和测试。
最后,我在NeDB中修改了model.js文件,更具体地说是修改了comparisonFunctions.$regex函数。我添加了一个额外的检查,看看传入的正则表达式是否可以从字符串形式转换为正则表达式。现在,model.js文件如下所示:
comparisonFunctions.$regex = function (a, b) {
if (!util.isRegExp(b)) {
try {
// convert the string based regex into an actual regular expression
b = new RegExp(b.replace(/[\\/]/g, ""), 'i');
// check again if it worked
if (!util.isRegExp(b))
throw new Error("$regex operator called with non regular expression");
} catch {
// we were not working with a regex
throw new Error("$regex operator called with non regular expression");
}
}
if (typeof a !== 'string') {
return false
} else {
return b.test(a);
}
};所以现在如果我把它传递给我的API:
{
"test": {
"$regex": "/ell/"
}
}它将返回数据库中test字段为== Hello的第一个文档
任何关于如何使这一点更整洁和/或反馈的建议都将非常感谢。
https://stackoverflow.com/questions/55651989
复制相似问题