Я пытаюсь создать запрос mongoose на стороне клиента, я создаю регулярное выражение для запросов без учета регистра, как показано ниже
query = {city: {'$regex': /NY/i}}
Однако, когда я получаю данные на сервере, я получаю пустой объект, как показано ниже.
query = {city: {'$regex': {}}}
Я не уверен, что я делаю неправильно.
Моя функция углового обслуживания для передачи данных выглядит следующим образом.
queryDB: function(query) {
var deferred = $q.defer();
$http.post("/path", {data: query})
.success(function(response) {
deferred.resolve(response);
})
.error(function(error) {
deferred.reject(error);
})
return deferred.promise;
},
Вы пытаетесь передать объект javascript, сгенерированный на стороне браузера, на экспресс-сервер. Данные, указанные в вызовах службы $ http, преобразуют данные из объектов javascript в JSON. JSON - это способ представления данных в текстовой форме, поэтому, когда ваше регулярное выражение преобразуется в объект emptry. Чтобы убедиться в этом, просто выполните инструкции в оболочке node.js.
> query = {city: {'$regex': /NY/i}}
{ city: { '$regex': /NY/i } }
> console.log(JSON.stringify(query))
{"city":{"$regex":{}}}
Чтобы получить требуемый результат, вы должны отправить свои данные в текстовой форме, а затем сгенерировать регулярное выражение на стороне сервера, а затем выполнить запрос регулярных выражений с помощью mongoose. Вы можете использовать флаг, чтобы проверить, должен ли запрос быть регулярное выражение или поиск в обычном тексте.
var query = {city: {data: "NY", isRegex: true}}
И затем на стороне сервера вы создаете объект regexp на основе флага
var regex = new regExp(city.data, 'i')
Вы также должны избегать регулярного выражения, поскольку оно генерируется из пользовательского ввода. Используйте функцию escape-выражения регулярного выражения, которая вытеснит все специальные символы в regexp.
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}