为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MYYA 2021-04-17 18:19:23
我已经在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"    }]当我find()使用硬编码JSON过滤器对数据执行时,它将返回正确的结果,例如{     test: {         $regex: /hell/i     }}将返回数据库中的第一条记录。但是,当我find()从传递了JSON对象过滤器的API调用函数时,收到了前面提到的错误。我的API中的过滤器添加如下:{ test: { '$regex': '/hell/i' } }看起来可能是单引号引起了一些问题,但即使将它们删除后也无法正常工作。我收到相同的错误或其他一些JSON解析错误。我检查了NeDB的代码,并在model.js文件中添加了一行以向控制台打印它检测到的正则表达式。在这两种情况下(有效的硬编码方法和API方法),正则表达式均返回为:/hell/i因此看来,NeDB在两个调用中都接收到相同的表达式,但是由于某种原因,API方法引发了错误。有没有人尝试使用该find()方法将JSON过滤器传递给NeDB实例并成功过滤?我正在使用Postman进行API测试。
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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


我最终model.js在NeDB中修改了文件,更具体地说是对该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


我们将非常感谢您提供有关如何整洁和/或反馈的任何建议。


查看完整回答
反对 回复 2021-04-29
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信