从客户端控制器指定Mongo查询参数(MEAN.JS)
Specifying Mongo Query Parameters From Client Controller (MEAN.JS)
我正在使用MongoDB, Angular, Express和Node (MEAN stack)构建应用程序。
我使用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')在我的客户端视图,将改变查询参数在我的服务器控制器?
另一种方法是在查询方法中传递搜索参数,如下所示:
$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);
}
});
};
这可能不是最干净的方法,但您可以创建一个新服务(或编辑当前服务以使用多个参数):
.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);
}
});
};
应该可以,但还没有测试过。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 参数变量出现ngTable指令问题
- AngularJS:我可以跳过函数参数回调吗
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 要求未定义JS回调参数
- 我的jQuery插件参数没有正确启动,遇到了问题
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- jquery设置为使用参数运行
- Javascript”;类“;带有参数的扩展
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- 无法在MEAN堆栈中传递更多参数
- 从客户端控制器指定Mongo查询参数(MEAN.JS)
- 我如何传递参数到express.js服务器端路由为MEAN.js包
- 加载由MEAN堆栈中的URL参数(例如/users/:id)路由的视图
- Mean Stack——Angular将参数从控制器传递到$resource对象
- ''JavaScript函数参数中的mean