Я пытаюсь создать базовый поиск, который будет возвращать результаты из базы данных Mongo. Запрос должен соответствовать значениям, которые являются либо полным значением, либо внутри значения. Например, поиск C
должен вернуть C, C#, C++
. Кроме того, Java
должен возвращать оба Java, Javascript
. В настоящее время у меня настроена простая реализация, которая может выполнить это, однако, если я ищу запрос C++
, мне возвращается внутренняя ошибка сервера. Поиск C+
вернет успешный поиск с C++
в списке. Это происходит только с ++
в запросе, так как поиск с двойными специальными символами (//, --, $$, etc.
) вернется успешно.
Я пытался использовать функцию Javascript RegExp
для достижения этой цели, однако я новичок в регулярных выражениях и уверен, что именно отсюда и возникла моя проблема. Текущая реализация
- Получает поисковый запрос из ввода и кодирует его
- Передает запрос контроллеру, который применяет функцию
RegExp
- Находит результаты в базе данных и возвращает результаты в объекте JSON
AJAX Позвоните для поиска
function getSearchResults() {
var query = $("#searchInput").val(); //search value
if(query === '') {
return false;
} else {
$.ajax({
url: '/items/search?search=' + encodeURIComponent(query), //url with search query
type: 'GET',
dataType: 'json',
beforeSend: function() {
$('#loadingOverlay').css('visibility', 'visible');
},
success: function(result) {
$('#itemContentMain').bootstrapTable({data: result});
$('#itemContentMain').bootstrapTable('load', result);
$('#loadingOverlay').css('visibility', 'hidden');
}
}).fail(function (xhr, ajaxOptions, thrownError){
alert("The search failed to return results: " + thrownError);
});
}
return false;
}
Контроллер
itemController.search = function(req, res) {
var regexEx = new RegExp(req.query.search, "i"); //ignore case
Item.find({ $or: [{name: regexEx}, {category: regexEx}, {subcategory: regexEx},
{status: regexEx}, {description: regexEx}]}).exec(function (err, items) {
if (err) {
console.log("Error:", err);
} else {
console.log("Search returning results");
res.send(items);
}
});
};
Я читал, что ++
в Regex - это квантификатор Possessive, так что, если двигатель не сработает, не вернется и попытается отменить найденные совпадения. Однако когда запрос достигает функции RegExp, он кодируется как /items/search?search=%2B%2B
. Что происходит, когда в запросе передается ++
, и как я могу уменьшить внутреннюю ошибку сервера, которую он вызывает?