通过DDP.connect连接两个Meteor应用程序需要执行以下步骤(据我所知):
我有两个应用程序(一个远程连接到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论坛),但找不到连接两个应用程序的推荐结构。
答案 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文件中。