Передача выражения регулярного выражения через API приводит к ошибке - PullRequest
0 голосов
/ 12 апреля 2019

Я создал API с помощью Express в NodeJS, который использует NeDB для своей базы данных.

Я изучил документацию и вижу, что существует способ фильтрации результатов с использованием регулярных выражений для переносаout операции, похожие на «like» в SQL.

Я могу заставить работать регулярные выражения при создании жестко закодированного объекта 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() из моего API, где я передаю JSONФильтр объекта через, я получаю ошибку, упомянутую ранее.

Фильтр из моего API добавляется следующим образом:

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

Похоже, что может бЕдиничные кавычки, которые вызывают некоторые проблемы, но даже после удаления их не работают.Либо я получаю ту же ошибку, либо какую-то другую ошибку синтаксического анализа JSON.

Я проверил код для NeDB и в файле model.js добавил строку для вывода на консоль того, какое регулярное выражение было обнаружено.В обоих случаях (работающий в жестком коде метод и метод API) регулярное выражение было возвращено как:

/hell/i

Таким образом, кажется, что NeDB получает идентичное выражение для обоих вызовов, нопо какой-то причине выдает ошибку с помощью метода API.

Кто-нибудь пытался передать JSON-фильтр в экземпляр NeDB с помощью метода find() и успешно ли он фильтровать?

Я использую Почтальондля моего тестирования API.

1 Ответ

0 голосов
/ 12 апреля 2019

Мне уже удалось выработать своего рода решение. Это ни в коем случае не идеально и все еще требует дополнительной работы и тестирования.

Я закончил тем, что изменил файл 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

Будем весьма благодарны за любые рекомендации о том, как сделать этот аккуратнее и / или обратную связь.

...