Mongodb Meteor:客户端查看页面时服务器端的增量DB值
我试图做一些看似简单的事情,每次获取值时更新MongoDB中的视图计数器 例如,我用这种方法尝试过Mongodb Meteor:客户端查看页面时服务器端的增量DB值,mongodb,meteor,meteor-blaze,Mongodb,Meteor,Meteor Blaze,我试图做一些看似简单的事情,每次获取值时更新MongoDB中的视图计数器 例如,我用这种方法尝试过 Meteor.methods({ 'messages.get'(messageId) { check(messageId, String); if (Meteor.isServer) { var message = Messages.findOne( {_id: messageId}
Meteor.methods({
'messages.get'(messageId) {
check(messageId, String);
if (Meteor.isServer) {
var message = Messages.findOne(
{_id: messageId}
);
var views = message.views;
// Increment views value
Messages.update(
messageId,
{ $set: { views: views++ }}
);
}
return Messages.findOne(
{_id: messageId}
);
},
});
但我不能让它按我的意愿工作。例如,if(Meteor.isServer)代码是无用的,因为它实际上没有在服务器上执行
此外,调用findOne后该值似乎不可用,因此它可能是异步的,但findOne没有回调功能
我不希望客户机控制这部分,这就是为什么我尝试在服务器端执行它,但每次客户机获取值时它都需要执行。这听起来很难,因为客户端已经订阅了数据
编辑:这是阅读此处答案后更新的方法
'messages.get'(messageId) {
check(messageId, String);
Messages.update(
messageId,
{ $inc: { views: 1 }}
);
return Messages.findOne(
{_id: messageId}
);
},
例如,if(Meteor.isServer)代码是无用的,因为它不是
在服务器上实际执行
Meteor方法始终在服务器上执行。您可以从客户端调用它们(使用回调),但执行发生在服务器端
调用findOne后,该值似乎不可用,
所以它可能是异步的,但findOne没有回调功能
你不需要叫它两次。请参阅下面的代码:
Meteor.methods({
'messages.get'(messageId) {
check(messageId, String);
var message = Messages.findOne({_id:messageId});
if (message) {
// Increment views value on current doc
message.views++;
// Update by current doc
Messages.update(messageId,{ $set: { views: message.views }});
}
// return current doc or null if not found
return message;
},
});
您可以通过您的客户将其称为:
Meteor.call('messages.get', 'myMessageId01234', function(err, res) {
if (err || !res) {
// handle err, if res is empty, there is no message found
}
console.log(res); // your message
});
此处新增两项:
为了数据的可伸缩性和封装,您可以将消息和视图拆分为单独的集合。如果发布方法不限于公共字段,则请求消息的客户端也会收到视图计数。这可能暂时有效,但可能会在更大范围内违反某些(未来即将出现的)访问规则。
views++
表示:
视图的当前值
,即使用当前(未修改)值构建修改器视图
的值,该值在您的情况下不再有用,因为您不将该变量用于任何其他用途为什么不使用mongo
$inc
操作符来避免检索以前的值呢?您和@Jankapunkt都在这里提供了帮助,但我只能标记一个答案。从本质上讲,帮助我理解Meteor.methods始终是服务器端的,所以我不必担心客户端不增加值。而且使用$inc运营商也有帮助。我已经用我现在使用的新meteor方法代码更新了我的问题。meteor.methods确实在客户机上运行(这称为a),如果客户机知道方法代码(通过其名称)。通常,如果同时在客户端和服务器中导入方法代码。如果不希望进行模拟,只需在服务器端导入代码即可。