Имитация фильтра поиска с использованием json-сервера

У меня есть routes.json и db.json

Маршрут

  "/api/*/_search?*=:searchstring": "/$1/?$2_like=:searchstring",
  "/api/*": "/$1"

DB.json

 {
  "cats": {
    "cats": []
  },
  "bats": [],
  "recordList": {
    "records": [
      {id:1, name: 'abc'},
      {id:2, name: 'def'},
      {id:3, name: 'ghi'}
    ]
  }
}

Абсолютно нормально получить список записей с указанными выше конфигурациями.

Нужно понять, как издеваться над вызовом поискового фильтра ниже:

http:localhost:3001/api/_search?name=abc

Обновлены маршруты к:

{
  "/api/*": "/$1",
  "/api/_search?name_like": "/$1"
}

По этой ссылке: https://github.com/typicode/json-server/issues/654#issuecomment-339098881

Но не попал по указанному URL-адресу конфигурации, что я делаю неправильно? Я что-то упустил здесь? Критерий поиска является динамическим, поэтому передаваемое значение должно быть допустимо только из переменной, но в комментарии оно является статическим. Помогите с этим, если у кого-то были похожие проблемы и они были решены

Если выполняется поиск 'abc', он должен вернуться

{
  records: [{id: 1, name: 'abc'}]
}

person Mithun Shreevatsa    schedule 27.08.2018    source источник


Ответы (1)


Вам нужно написать маршрут поиска следующим образом:

{
  "/api/records/_search?name=:searchstring": "/records/?name_like=:searchstring"
}

Или, что еще лучше, вы можете параметризовать с заменой * на $1, таким образом, вы сможете искать любой параметр в запросе и в любом наборе данных, records или другом:

{
  "/api/*/_search?*=:searchstring": "/$1/?$2_like=:searchstring",
  "/api/*": "/$1"
}

После этого на ваш запрос к http://localhost:3001/api/records/_search?name=ab будет ответ:

[
  {
    "id": 1,
    "name": "abc"
  }
]

Дополнительные документы по маршрутизации.

person Andy Theos    schedule 27.08.2018
comment
Высоко ценю ваш ответ @Andy Theos. Но я не могу решить проблему с некоторыми глупостями. /api/records/_search?searchTerm=abc из-за добавления _search?searchTerm=abc из сетки данных. В моем случае поисковый запрос должен относиться к name. - person Mithun Shreevatsa; 27.08.2018
comment
Не совсем понял, о чем вы говорите, но я обновил свой ответ параметризованным решением. - person Andy Theos; 27.08.2018
comment
Я обновил свою точную маршрутизацию, пожалуйста, проверьте, что _search?searchTerm=:val должно быть привязано к: { records: [{id: 1, name: 'abc'}] } с использованием name в качестве identifier ключа поиска - person Mithun Shreevatsa; 27.08.2018
comment
Да, проверьте мое параметризованное решение с * по $1 - person Andy Theos; 27.08.2018
comment
здесь не будет records в URL :( - person Mithun Shreevatsa; 27.08.2018
comment
"api/*": "$1" загружает все записи, такие как: { records: [{id: 1, name: 'abc'}] } и api/*/_search&searchTerm должны быть чем-то, что загружает отфильтрованные записи - person Mithun Shreevatsa; 27.08.2018
comment
Должен быть api/records, если вы используете "api/*": "$1". Кроме того, вы должны сначала написать правило замены поиска, чтобы api/* не перезаписал его. Например. { "/api/*/_search?*=:searchstring": "/$1/?$2_like=:searchstring", "/api/*": "/$1" }. Ответ обновлен. - person Andy Theos; 27.08.2018
comment
так как справиться с этим обоим? плохо принимаю ответ. Это становится большим - person Mithun Shreevatsa; 27.08.2018
comment
не могли бы вы сказать, где здесь искать имя: { "/api/*/_search?*=:searchstring": "/$1/?$2_like=:searchstring", "/api/*": "/$1" } . Также как обрабатывать все * записи с другим маршрутом, если не сформирован URL-адрес _search - person Mithun Shreevatsa; 27.08.2018
comment
Есть замена поиску, второй * на $2 в конфиге маршрутов. Вот почему _search?name=ab переводится в ?name_like=ab. Второе правило захватит все остальные маршруты. - person Andy Theos; 27.08.2018
comment
в настоящее время работает нормально для всех (*) записей, а также нажимает URL-адрес строки запроса _search. Но не фильтрация записи имени, как ожидалось, вместо загрузки всех записей. Доно почему :( - person Mithun Shreevatsa; 27.08.2018
comment
Затем вставьте свою фильтрацию для записи имени и точного route.json, я отлично заработал на своей машине с вышеупомянутой конфигурацией. - person Andy Theos; 27.08.2018
comment
обновил мой пост с фактическими маршрутами и db.json. Пожалуйста, посмотрите @Энди Теос - person Mithun Shreevatsa; 27.08.2018
comment
Ничего себе, вы изменили схему json... Вам нужно сгладить или написать другой маршрут, например. нет recordList: {records: [...]}, используйте records: [...] как раньше. Если вы хотите обернуть свой ответ recordsList, вам нужно изучить документацию модуля. Он отлично работает с records:[...], все другие проблемы, которые вы указали в комментариях, выходят за рамки этого вопроса. Ура, надеюсь, это поможет. - person Andy Theos; 27.08.2018
comment
нет, я не изменился, * всегда имел в виду записи. Родительским атрибутом был RecordList. я просто выложил минимум материала - person Mithun Shreevatsa; 27.08.2018
comment
Родительским атрибутом был recordList, его не было в исходной схеме :-) Я ответил на ваш вопрос о насмешках при поиске, вы можете попробовать решить другие свои проблемы с помощью другого вопроса, если хотите. - person Andy Theos; 27.08.2018
comment
* относится к recordList, который отображает records. не беспокойтесь за recordList. Как сломать этот records и выполнить поиск. recordList это routename для вашего сведения. /routeList как *. На этом ветка завершится - person Mithun Shreevatsa; 27.08.2018