通过API传递正则表达式会导致错误

时间:2019-04-12 12:48:56

标签: javascript regex express nedb

我已经在NodeJS中使用Express创建了一个API,该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
     }
}

将返回数据库中的第一条记录。

但是,当我从API调用find()函数时,我在其中传递JSON对象过滤器时,收到了前面提到的错误。

我的API中的过滤器添加如下:

{ test: { '$regex': '/hell/i' } }

看起来可能是单引号引起了一些问题,但即使将它们删除后也无法正常工作。我收到相同的错误或其他JSON解析错误。

我检查了NeDB的代码,并在model.js文件中添加了一行以向控制台打印它检测到的正则表达式。在两种情况下(有效的硬编码方法和API方法),正则表达式均返回为:

/hell/i

因此,似乎NeDB在两个调用中都接收到相同的表达式,但是由于某种原因,API方法会引发错误。

是否有人尝试使用find()方法将JSON过滤器传递给NeDB实例并成功过滤?

我正在使用Postman进行API测试。

1 个答案:

答案 0 :(得分:0)

我现在设法制定出一种解决方案。这绝不是完美的,仍然需要更多的工作和测试。

我最终修改了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

返回第一个文档

任何有关如何整洁和/或反馈的建议将不胜感激。