【发布时间】:2015-08-19 19:01:26
【问题描述】:
我是 JavaScript 和流星框架的新用户,试图理解基本概念。首先,我想将单个文档添加到集合中而没有重复条目。
this.addRole = function(roleName){
console.log(MongoRoles.find({name: roleName}).count());
if(!MongoRoles.find({name: roleName}).count())
MongoRoles.insert({name: roleName});
}
此代码在服务器和客户端上调用。客户端上的日志消息告诉我集合中没有条目。即使我多次刷新页面。
在服务器上,重复的条目被输入到集合中。我不知道为什么。可能我没有理解关键概念。有人可以向我指出吗?
Edit-1: 不,不再安装自动发布和不安全。但是我已经发布了 MongoRoles 集合(服务器端)并订阅了它(客户端)。此外,我为插入(客户端)创建了一个允许规则。
Edit-2:
非常感谢您向我展示了流星方法,但我想在不涉及服务器端方法的情况下做到这一点。让我们出于学术目的说。 ;-)
只是写了一个小例子:
客户:
Posts = new Mongo.Collection("posts");
Posts.insert({title: "title-1"});
console.log(Posts.find().count());
服务器:
Posts = new Mongo.Collection("posts");
Meteor.publish(null, function () {
return Posts.find()
})
Posts.allow({
insert: function(){return true}
})
如果我通过“meteor mongo”检查服务器数据库,它会告诉我客户端代码的每个插入都保存在那里。
每次我刷新页面时,客户端上的日志都会告诉我“1 个计数”。但我希望两者都一样。我做错了什么?
Edit-3:
我又回到了我原来的角色示例(对此感到抱歉)。只是以为我明白了,但我仍然一无所知。如果我检查变量“roleCount”,则始终响应 0。如何将正确的值加载到我的变量中?在插入集合之前检查文档是否存在的最佳方法是什么?猜猜 .find() 也是异步的?如果是这样,我怎样才能做到同步?如果我做对了,我必须等待该值(同步),因为我真的会对其进行中继。
共享环境(客户端和服务器):
Roles = new Mongo.Collection("jaqua_roles");
Roles.allow({
insert: function(){return true}
})
var Role = function(){
this.addRole = function(roleName){
var roleCount = Roles.find({name: roleName}).count();
console.log(roleCount);
if(roleCount === 0){
Roles.insert({name: roleName}, function(error, result){
try{
console.log("Success: " + result);
var roleCount = Roles.find({name: roleName}).count();
console.log(roleCount);
} catch(error){
}
});
}
};
this.deleteRole = function(){
};
}
role = new Role();
role.addRole('test-role');
仅服务器:
Meteor.publish(null, function () {
return Roles.find()
})
【问题讨论】:
-
是否安装了
autopublish包?尝试在终端中使用meteor list来找出答案。 -
我遵循@BraveKenny 的要求,并添加我关于
insecure包的问题。尝试在线完成教程 [这里]。(meteor.com/tutorials/blaze/creating-an-app) 之后一切都会更清楚 -
抱歉,缺少信息。不,不再安装自动发布和不安全。但是我已经发布了 MongoRoles 集合(服务器端)并订阅了它(客户端)。此外,我为插入(客户端)创建了一个允许规则。感谢您的提示。我已经完成了本教程,并认为我明白了这一点。但显然我没有。据我了解,如果我在双方实现相同的功能,客户端数据库和服务器数据库应该相互同步。但我不知道为什么它不是我的情况。更糟糕的是,为什么服务器数据库中添加了多个条目?
-
如果没有更多代码,很难判断发生了什么。你在哪里调用
addRole函数? -
在我的问题中添加了另一个示例。我只想为集合添加一些值。之后客户端和服务器数据库应该具有相同的值。在下一步中,我想根据客户端数据库中的值执行一些选项检查。我对异步方式(Meteor.methods)感到困惑。如果这样做,我将无法及时获得返回值,一切都会变得一团糟。
标签: mongodb meteor collections