Meteor:通过DDP

时间:2016-01-28 05:56:13

标签: javascript mongodb meteor

通过DDP.connect连接两个Meteor应用程序需要执行以下步骤(据我所知):

  1. 在远程应用上发布该集合
  2. 通过DDP.connect连接到 远程应用程序
  3. 订阅远程集合(同一个对象) 通过DDP.connect返回)
  4. 创建新的Mongo集合
  5. 在帮助文件中返回集合的文档
  6. 使用{{each collectionName}} {{/ each}}
  7. 显示模板(html文件)中的文档

    我有两个应用程序(一个远程连接到MongoDB,另一个远程连接到处理所有前端交互)。我可以成功地通过它连接它们(步骤2和3 - 代码位于名为_connect.js的文件中的lib文件夹中,以确保它在该文件夹中的任何其他代码之前执行):

    if (Meteor.isServer) {
        if (process.env.NODE_ENV === 'development') {
            // development environment
            worker_host = 'localhost:4000';     // ip address of job worker host
            // connect to job worker
            remote = DDP.connect(worker_host);
        }
        remote.subscribe('cards', function() {
            console.log('Number of docs: ' + Cards.find().count());
        });
    }
    

    并且当我使用remote.subscribe时,它还会显示预期文档的数量。 这是代码中唯一显示正确数量的文档的地方,其他地方显示为0。

    通过(步骤1)在远程服务器(在端口4000上运行)正确发布卡片集合:

    Meteor.publish('cards', function() {
        return Cards.find()
    });
    

    第4步:我不确定该代码的确切位置。它目前位于lib文件夹中,因此客户端和服务器上都知道该集合:

    Cards = new Mongo.Collection('cards',remote);
    console.log('Number of docs: ' + Cards.find().count());
    

    此代码执行时始终显示0个文档。

    但是,当我想访问模板助手中的相同(远程)集合时(步骤5 - 文件位于client文件夹中):

    Template.puzzle.helpers({
        cards: function() {
            console.log('Number of docs: ' + Cards.find().count());
            return Cards.find();
        }
    });
    

    在帮助程序代码中找不到单个文档。

    由于上述原因在html模板中显示 (也在client文件夹中):

    <template name="puzzle">
        <div class="container">
            {{#each cards}}
                // lot's of <div> displaying the content of the cards doc
            {{/each}}
        </div>
    </template>
    

    显然,我一定忽略了一些非常简单的事情,我怀疑这是我的相关代码的位置。

    我需要更改上述代码的哪些步骤才能访问远程集合?我检查了常用的源代码(SO,Meteor论坛),但找不到连接两个应用程序的推荐结构。

    PS:我看过Connect two Meteor applications using DDP

1 个答案:

答案 0 :(得分:0)

执行此操作的正确方法确实是@Robert Simon所建议的,决定是仅在服务器上运行还是仅在客户端运行它。由于我需要通过客户端显示集合的内容,所以必须将所有内容移动到客户端。

这些是使其有效的编辑:

步骤2/3(将_connect.js文件移至client文件夹:

worker_host = 'localhost:4000';     // ip address of job worker host

// connect to job worker
remote = DDP.connect(worker_host);
remote.subscribe('cards', function() {
    console.log('Number of cards1: ' + Cards.find().count());
});

步骤4(将cards.js文件移至client文件夹:

Cards = new Mongo.Collection('cards',remote);

当puzzle.js文件(帮助程序)第一次执行时,它没有显示任何卡片,因为应用程序运行速度非常快,以至于没有通过DDP传输数据。在随后的第二次运行中,所有文档都在帮助程序中接收并显示在html文件中。