Указание параметров запроса Mongo от контроллера клиента (MEAN.JS)
Я создаю приложение, используя MongoDB, Angular, Express и Node (MEAN stack).
Я использовал среднее значение.Генератор JS, чтобы построить мое приложение.
Я буду использовать модуль статей в качестве ссылки.
Предположим, что в моей коллекции статей 7000 записей, и каждая запись имеет дату, связанную с ней. Это неэффективно загружать все 7000 записей в память каждый раз, когда я загружаю страницу для просмотра записей в таблице, и я вижу ужасные потери производительности благодаря ей. По этой причине я хотел бы только загрузить записи с датой в диапазоне от (1 месяц назад) до (1 год спустя) и отобразить их в таблице. В настоящее время я могу сделать это со следующим:В моих статьях.клиент.контроллер.js:
$scope.find = function() {
$articles = Articles.query();
};
...и в моих статьях тоже.сервер.контроллер.js:
var now = new Date();
var aYearFromNow = new Date(now.getTime() + 86400000*365); //add a year
var aMonthAgo = new Date(now.getTime() - 86400000*30); //subtract roughly a month
exports.list = function(req, res) { Article.find().where('date').lt(aYearFromNow).gt(aMonthAgo).sort('-created').populate('user', 'displayName').exec(function(err, articles) {
if (err) {
return res.send(400, {
message: getErrorMessage(err)
});
} else {
res.jsonp(articles);
}
});
};
Проблема в том, что это не динамический способ делать вещи. Другими словами, Я хочу, чтобы пользователь мог указать, как далеко назад и как далеко вперед он хочет видеть.
Как я могу привязать переменные (например, 'aYearFromNow' и 'aMonthAgo') в представлении клиента, которые изменят параметры запроса в контроллере сервера?
2 ответа:
Это, вероятно, не самый чистый способ, но вы можете создать новый сервис (или отредактировать текущий, чтобы работать с несколькими параметрами):
.factory('ArticlesService2', ['$resource', function($resource) { return $resource('articles/:param1/:param2', { param1: '', param2: '' }, { update: { method: 'PUT' } }); } ]);
Затем вызовите его в своем контроллере:
$scope.findWithParams = function() { $scope.article = ArticlesService2.query({ param1: $scope.aYearFromNow, param2: $scope.aMonthAgo }); };
На заднем плане вам нужно будет подготовить маршрут:
app.route('/articles/:param1/:param2') .get(articles.listWithParams)
Добавьте функцию в свой внутренний контроллер:
exports.listWithParams = function(req, res) { Article.find() .where('date') .lt(req.params.param1) .gt(req.params.param2) .sort('-created').populate('user', 'displayName') .exec(function(err, articles) { if (err) { return res.send(400, { message: getErrorMessage(err) }); } else { res.jsonp(articles); } }); };
Должно работать, хотя я его не проверял.
Другой способ-просто передать параметры поиска в методе запроса, например:
$scope.searchart = function() { Articles.query({start:$scope.startDate, end:$scope.endDate}, function(articles) { $scope.articles = articles; }); };
А затем на контроллере на стороне сервера считайте параметры строки запроса следующим образом:
exports.searcharticle = function(req, res) { Article.find().where('date').gt(req.query['start']).lt(req.query['end']).exec(function(err, articles) { if (err) { res.render('error', { status: 500 }); } else { res.jsonp(articles); } }); };
Этот способ не требует дополнительных маршрутов или услуг.