对Meteor感到困惑:如何在不写入数据库的情况下向所有客户端发送数据?

kur*_*kun 8 meteor

我实际上已经玩弄了Meteor一段时间,但我意识到我仍然缺乏一些(或很多!)对这个主题的理解.

例如,这是一个使用node.js/express/socket.io进行简单实时聊天的教程:http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with -nodejs插槽-IO-和expressjs /

在上面的示例中,通过socket.io,Web服务器接收一些数据并将其传递到所有连接的客户端 - 所有这些都没有任何数据库访问.

使用Meteor,在我看到的所有示例中,通过写入mongodb来更新客户端,mongodb然后更新所有客户端.但是,如果我不需要将数据写入数据库呢?将数据传递给所有客户端似乎是一个昂贵的步骤.

我相信我在这里遗漏了一些东西.更新所有客户端的Meteor方式是什么(比如简单的聊天应用程序),但不需要先花费数据写入数据库?

谢谢!

Aks*_*hat 10

目前还没有正式的方法将数据发送给客户而不将其写入集合.它在流星中有点小问题,因为当没有可写入的地方时,将数据发送到多个客户端的步骤来自多个流星一起使用时.即从一个流星发送的物品不会来到另一个订购的客户.

有一个使用Meteor Streams(http://meteorhacks.com/introducing-meteor-streams.html)的临时解决方案可以让你做你想做的事情而不用同时写入数据库.

如果您想了解一些技术细节,还可以在流星谈话(https://groups.google.com/forum/#!topic/meteor-talk/Ze9U9lEozzE)上进行相当广泛的讨论.当链接器分支合并到主服务器时,对于单个服务器,这实际上是可能的

这里有一个虚拟收藏的方法,它不完美,但它可以做到直到Meteor有一个更完美的方式完成它.

Meteor.publish("virtual_collection", function() {
    this.added("virtual_coll", "some_id_of_doc", {key: "value"});

    //When done
    this.ready()
});
Run Code Online (Sandbox Code Playgroud)

然后在客户端订阅:

var Virt_Collection = new Meteor.Collection("virtual_coll");
Meteor.subscribe("virtual_collection");
Run Code Online (Sandbox Code Playgroud)

然后,您可以在订阅完成时运行此命令:

Virt_Collection.findOne();
=> { _id: "some_id_of_doc", key: "value"}
Run Code Online (Sandbox Code Playgroud)

这有点乱,但你也可以挂钩来更新或删除集合.至少这种方式虽然你不会使用任何插件或包.

有关更多详细信息和视频示例,请参阅:https://www.eventedmind.com/posts/meteor-how-to-publish-to-a-client-only-collection.


use*_*291 6

服务器上的发布功能将数据发送给客户端.它有一些方便的快捷方式来从数据库发布查询结果,但您不必使用它们.publish函数有this.added(),this.removed()和this.changed(),允许您发布您选择的任何内容.然后,客户端订阅并接收已发布的数据.

例如:

if ( Meteor.isClient ){
  var someMessages = new Meteor.Collection( "messages" );  //messages is name of collection on client side
  Meteor.subscribe ( "messagesSub" );  //messagesSub tells the server which publish function to request data from

  Deps.autorun( function(){
    var message = someMessages.findOne({});
    if ( message )  console.log( message.m ); // prints This is not from a database
  });
}

if (Meteor.isServer ) {
  Meteor.publish( "messagesSub", function(){
    var self = this;
    self.added ( "messages", "madeUpId1", { m: "This is not from a database"} ); //messages is the collection that will be published to
    self.ready();
  });
}
Run Code Online (Sandbox Code Playgroud)

有流星文档说明的例子在这里和另一个例子在这里.我还有一个示例,它在客户端之间共享数据,而不使用数据库只是为了教我自己如何发布和订阅.除了基本的流星之外什么也没用过.