【问题标题】:Meteor.publish() throw an exception in defer callbackMeteor.publish() 在延迟回调中抛出异常
【发布时间】:2015-08-31 20:18:45
【问题描述】:

我在服务器控制台中发现了这个错误:

延迟回调中的异常:TypeError: undefined is not a function 在包/ddp/livedata_server.js:1054:1 在 Array.forEach (本机) 在 Function..each..forEach (packages/underscore/underscore.js:105:1) 在 [object Object]._.extend._callStopCallbacks (packages/ddp/livedata_server.js:1053:1) 在 [object Object]._.extend._deactivate (packages/ddp/livedata_server.js:1043:1) 在包/ddp/livedata_server.js:803:1 在 Function..each..forEach (packages/underscore/underscore.js:113:1) 在 [object Object]._.extend._deactivateAllSubscriptions (packages/ddp/livedata_server.js:802:1) 在包/ddp/livedata_server.js:444:1 在 [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)

这里是我使用的代码:

/* Source: http://phucnguyen.info/blog/how-to-publish-to-a-client-only-collection-in-meteor/ */
var subs = {};
Meteor.publish(

// THROW AN 'EXCEPTION IN DERFER CALLBACK: ...'
  'helperPublication',  
  function () {
    var subscription = this;
    subs[subscription._session.id] = subscription;
    Datasets.find().map(function (dataset) {
      subscription.added(
        'subdatasets',
        dataset._id,
        {
          name: dataset.name,
          data: [],   // To avoid "Uncaught TypeError: Cannot read property 'length' of undefined" error on load
          peaks: []   // Idem
        }
      )
    });
    subscription.onStop();
    subscription.ready()
});

您可以在以下流星垫中找到整个应用程序:http://meteorpad.com/pad/6NDneym2qEW7pF9JM/ClearChrom

【问题讨论】:

  • 我认为您有很多问题。你到底想用这段代码实现什么?
  • 出于性能考虑,我使用了 2 个独立的数据库。一种称为数据集,由客户端(受限访问)和服务器共享。另一个是仅限客户端的数据库:它存储数据集文档的克隆 BUT 键“数据”是数据的短子集(按需加载)。使用上面的代码,我想将 Datasets 文档复制到仅限客户端的数据库中。而且,可选地,我想为每个连接的客户端执行此操作(但坦率地说,我真的不需要也不想这样做,但我不知道如何更改 Phuc Nguyen 代码的那部分。 ..)。是不是更清楚了?

标签: meteor


【解决方案1】:

好的,所以有了这些信息;我认为最好的方法是为data 单独收集。因为这样您就可以轻松更改应显示的数据量。该集合的出版物可能如下所示:

Meteor.publish('data', function publishData (limit) {
  return DataCollection.find({}, {
    fields: {
      name: 1,
      data: 1,
      peaks: 1
    },
    limit: limit
  })
});

请注意,发布的回调采用参数limit。您现在可以像这样订阅它:

Meteor.subscribe('data', 3)

当您需要更多数据时,您可以:

Meteor.subscribe('data', 6)

所以这个解决方案是反应性的并且非常干净(至少在我看来)。

我还检查了您现有的脚本:

var subs = {};

Meteor.publish(
  'helperPublication',
  function (limit) {
    var subscription = this;
    subs[subscription._session.id] = subscription;
    // I'd use forEach here, because you're not modifying the document
    Datasets.find().forEach(function (doc) {
      subscription.added(
        'subdatasets',
        doc._id,
        {
          name: doc.name,
          // Whith the slice function you can get a subset of the data array
          data: doc.data.slice(0, limit),
          peaks: doc.peaks
        }
      )
    });
    // Calling `subscription.onStop` without an argument doesn't do anything
    // Except maybe through an error
    subscription.onStop(function () {
      // clean the subscription from subs again
      delete subs[subscription._session.id];
    });
    // This shouldn't be necessary.
    // subscription.ready()
});

这仍然存在一些问题。一方面,我建议您尽量避免使用前面带有下划线的流星属性。 它们可能会在未来的版本中被删除或更改

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多