通过DDP.connect连接两个Meteor应用程序需要以下步骤(据我所知):
- 在远程应用上发布集合
- 通过 DDP.connect 连接到远程应用
- 订阅远程集合(与通过DDP.connect返回)
- 创建新的 Mongo 集合
- 在帮助程序文件中返回集合的文档
- 在模板(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 文件中。