流星:通过 DDP 连接两个应用程序时,模板帮助程序中没有来自远程集合的文档



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

  1. 在远程应用上发布集合
  2. 通过 DDP.connect 连接到远程应用
  3. 订阅远程集合(与通过DDP.connect返回)
  4. 创建新的 Mongo 集合
  5. 在帮助程序文件中返回集合的文档
  6. 在模板(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:我已经阅读了使用DDP连接两个Meteor应用程序

正确的

方法确实是 @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(将卡.js文件移动到client文件夹:

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

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

最新更新