【问题标题】:Meteor admin show collections from other packagesMeteor 管理员显示来自其他软件包的集合
【发布时间】:2016-06-26 02:27:20
【问题描述】:

我试图让Meteor Admin 显示SyncedCron 的条目。 Meteor 管理员需要您attachSchema 才能注册收藏。我已经用我自己的简单集合做到了这一点,例如一个基本的事件集合,但无法弄清楚我如何在管理员中看到 SyncedCron 作业:

SyncedCron 在我的应用中运行良好。文档说它是“uses a collection called cronHistory to syncronize between processes”。如果我跑:

> SyncedCron._entries
   { name: 'LExXMbhKE7bJF5nay notification 2',
 schedule: [Function],
 job: [Function],
 _timer: { clear: [Function] } },
'LExXMbhKE7bJF5nay notification 3':
 { name: 'LExXMbhKE7bJF5nay notification 3',
  schedule: [Function],
  job: [Function],
  _timer: { clear: [Function] } } }

我检查 cronHistory 是否存在:

Mongo.Collection.getAll();

{ name: 'cronHistory',
instance:
 { _makeNewID: [Function],
   _transform: null,
   _connection: [Object],
   _collection: [Object],
   _name: 'cronHistory',
   _driver: [Object],
   _restricted: false,
   _insecure: undefined,
   _validators: [Object],
   _prefix: '/cronHistory/',
   before: [Object],
   _hookAspects: [Object],
   after: [Object],
   hookOptions: [Object],
   direct: [Object] },
options: undefined }

所以我尝试在为 Meteor Admin 注册之前附加一个架构:

cronHistory.attachSchema(new SimpleSchema({
name: {
type: String,
label: "Name"
}
}));

并得到错误:

ReferenceError: cronHistory is not defined

有什么想法吗?

【问题讨论】:

    标签: javascript meteor collections cron


    【解决方案1】:

    我相信SyncedCron 会写入cronHistory 集合,但不会导出集合句柄。根据this,该集合应该可以通过SyncedCron._collection访问。

    鉴于此,您应该能够做到:

    Meteor.startup(function () {
      var root = Meteor.isClient ? window : global;
      root.CronHistory = SyncedCron._collection;
      root.CronHistory.attachSchema(...);
    });
    

    更新答案

    根据我们下面的对话,这只是一个非常困难的问题。你有两个包和你的应用程序都定义和使用集合,并且排序需要精确才能使一切正常工作。这就是我要做的:

    1. 定义一个 CronHistory 集合,就像您在应用中定义任何其他集合一样,并像往常一样附加架构。

    2. CronHistory 添加到您的AdminConfig 以及您应用中的其他集合。

    3. 使用 local versionSyncedCron 并修改它以查找全局定义的 CronHistory 集合。有关一些提示,请参阅this post。请注意,您需要删除 new Mongo.Collection(options.collectionName); 行。

    【讨论】:

    • 试试更新的答案。看起来应该可以,但我不确定。
    • 这听起来像是一个负载排序问题,上面的代码在SyncedCron 的定义之前运行。以上是在一个包中还是只是在您的应用程序代码中的某个地方?要尝试的一件事就是将其包装在 Meteor.startup... 尽管这可能还有其他问题。
    • 我不知道我是否能让你摆脱困境,但我会继续努力。 :) 查看更新的答案。我不确定你是否在客户端和服务器上都需要这个,所以我用通用的方式写了它。
    • 我查看了流星管理源,我认为问题出在包的设计方式上。它需要一个全局变量 (AdminConfig) 来定义集合(这是一个不幸的 API 选择)。您可能正在其他地方设置它,并且流星管理包在您的 Meteor.startup 之前执行,这意味着它找不到集合。我想说你应该提出一个问题,但那个包裹看起来不太健康。
    • 查看更新后的答案。我认为您最好的选择是覆盖 SC 的工作方式。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2012-02-27
    • 2021-10-17
    • 2014-01-26
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多