Указание параметров запроса Mongo из клиентского контроллера (MEAN.JS)

Я создаю приложение, используя MongoDB, Angular, Express и Node (стек MEAN).

Я использовал генератор MEAN.JS для создания каркаса своего приложения.

Я буду использовать модуль статей в качестве справки.

Предположим, у меня есть 7000 записей в моей коллекции статей, и каждая запись имеет связанную с ней дату. Неэффективно загружать все 7000 записей в память каждый раз, когда я загружаю страницу для просмотра записей в таблице, и из-за этого я наблюдаю ужасные потери производительности. По этой причине я хотел бы загружать только записи с датой в диапазоне от (1 месяц назад) до (1 год с настоящего момента) и отображать их в таблице. В настоящее время я могу сделать это со следующим:

В моих статьях.client.controller.js:

$scope.find = function() {
        $articles = Articles.query();
};

...и в моих статьях.server.controller.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") в моем клиентском представлении, что изменит параметры запроса в контроллере моего сервера?


person caseyhanley    schedule 17.07.2014    source источник


Ответы (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);
        }
    });
};

Должно работать, но не проверял.

person Goodzilla    schedule 17.07.2014

Другой способ — просто передать параметры поиска в метод запроса, например:

 $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);
        }
    });
};

Этот способ не требует дополнительных маршрутов или сервисов.

person yass    schedule 10.11.2014
comment
Это более чистый способ справиться с этим, не требуя добавления маршрутов и беспорядка на стороне сервера. Используя запрос, вы можете сохранить общий метод списка, условно добавив параметры мангуста. - person HdN8; 31.07.2015