我正在尝试使用Meteor.js在客户端中将新文档插入集合的两种方法之间做出决定。调用服务器方法或直接使用db API。
所以,我可以直接在客户端访问db api:
MyCollection.insert(doc)
或者,我可以创建一个新的服务器方法(在/server
目录下):
Meteor.methods({
createNew: function(doc) {
check(doc, etc)
var id = MyCollection.insert(doc);
return project_id;
}
});
然后从客户端调用它:
Meteor.call('createNew', doc, function(error, result){
// Carry on
});
两者都有效,但就我在测试中看到的情况而言,如果直接点击db api,我只会受益于延迟补偿(本地缓存更新并在服务器响应之前在屏幕上显示),而不是我使用服务器方法,所以我倾向于以这种方式做事。但我也得到的印象是最安全的方法是在服务器上使用一个方法(主要是因为Emily Stark在她的视频here中将其作为示例)但是无论什么时候客户端都可以使用db api那么为什么服务器方法会更好?
我在其他地方阅读源代码时看到了两种方法,所以我很难过。
请注意。在这两种情况下,我都有适当的允许/拒绝规则:
MyCollection.allow({
insert: function(userId, project){
return isAllowedTo.createDoc(userId, doc);
},
update: function(userId, doc){
return isAllowedTo.editDoc(userId, doc);
},
remove: function(userId, doc){
return isAllowedTo.removeDoc(userId, doc);
}
});
简而言之:建议使用哪种?为什么?
答案 0 :(得分:0)
问题是我在/server
文件夹下有方法声明,因此客户端无法使用它们,这打破了延迟补偿(客户端创建这些方法的存根以模拟操作但在我的案件不能,因为它看不到它们)。将它们移出此文件夹后,我能够以干净,安全和延迟补偿的方式使用服务器方法(即使我的所有Allow / Deny规则都设置为false - 它们什么也不做,只适用于直接从db api访问客户端,而不是服务器。)
简而言之:不要在客户端上使用db api或在服务器上使用/拒绝规则,忘记它们曾经存在并只编写服务器方法,确保客户端和服务器都可以访问它们,并使用这些反而是为了crud。