首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过API传递正则表达式会导致错误

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

Stack Overflow用户
提问于 2019-04-12 20:48:56
回答 1查看 191关注 0票数 0

我已经在NodeJS中使用Express创建了一个API,它使用NeDB作为它的数据库。

我已经检查了文档,我可以看到有一种方法可以使用正则表达式过滤结果,以便执行类似于SQL中的"like“操作。

当创建一个硬编码的JSON对象作为过滤器时,我可以让正则表达式工作,但是当过滤器通过我的API传递时,NeDB报告以下错误:

Error: $regex operator called with non regular expression

我的测试数据库包含以下文档:

代码语言:javascript
复制
[
    {
        "test": "Hello",
        "other": "Goodbye",
        "_id": "9T0WaZ240q6ZK747"
    },
    {
        "test": "sup!",
        "other": "Ta ta",
        "extra": "something",
        "_id": "jLUzEZjLDVX1lmU5"
    }
]

当我使用硬编码的JSON过滤器对数据执行find()时,它将返回正确的结果,例如

代码语言:javascript
复制
{
     test: {
         $regex: /hell/i
     }
}

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

但是,当我从我的应用程序接口调用find()函数时,我收到了前面提到的错误。

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

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

看起来可能是单引号导致了一些问题,但即使在去掉它们之后,它也不起作用。我要么得到相同的错误,要么得到其他一些JSON解析错误。

我检查了NeDB的代码,并在model.js文件中添加了一行代码,以便将检测到的正则表达式输出到控制台。在这两种情况下(工作的硬编码方法和API方法),正则表达式被返回为:

/hell/i

因此,看起来NeDB为两个调用接收了相同的表达式,但是由于某种原因,它抛出了一个错误。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 22:41:37

我现在已经想出了一种解决方案。这绝不是完美的,仍然需要更多的工作和测试。

最后,我在NeDB中修改了model.js文件,更具体地说是修改了comparisonFunctions.$regex函数。我添加了一个额外的检查,看看传入的正则表达式是否可以从字符串形式转换为正则表达式。现在,model.js文件如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{
    "test": {
        "$regex": "/ell/"
    }
}

它将返回数据库中test字段为== Hello的第一个文档

任何关于如何使这一点更整洁和/或反馈的建议都将非常感谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55651989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档