2015-06-16 5 views
0

я нашел эту ошибку в консоли сервера:Meteor.publish() сгенерирует исключение в Defer обратного вызова

Exception in defer callback: TypeError: undefined is not a function at packages/ddp/livedata_server.js:1054:1 at Array.forEach (native) at Function..each..forEach (packages/underscore/underscore.js:105:1) at [object Object]._.extend._callStopCallbacks (packages/ddp/livedata_server.js:1053:1) at [object Object]._.extend._deactivate (packages/ddp/livedata_server.js:1043:1) at packages/ddp/livedata_server.js:803:1 at Function..each..forEach (packages/underscore/underscore.js:113:1) at [object Object]._.extend._deactivateAllSubscriptions (packages/ddp/livedata_server.js:802:1) at packages/ddp/livedata_server.js:444:1 at [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

+0

Я думаю, что есть несколько вещей, которые вы ошибались. Что именно вы пытаетесь достичь с помощью этого кода? – Kriegslustig

+0

Для обеспечения производительности я использую две отдельные базы данных. Один из них называется наборами данных и используется клиентами (ограниченным доступом) и сервером. Другая - это база данных только для клиентов: она хранит клоны документов Datasets **. НО ** данные «ключи» - это короткие подмножества данных (загрузка по требованию). С помощью приведенного выше кода я хотел бы дублировать документы Datasets в базе данных только на стороне клиента. И, факультативно, я хочу сделать это для каждого подключенного клиента (но, откровенно говоря, мне действительно не нужно ни в коем случае не хотеть этого делать, но я не знал, как изменить эту часть кода Phuc Nguyen ...). Это делает его более ясным? –

ответ

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() 
}); 

Есть некоторые проблемы с этим до сих пор. Во-первых, я бы посоветовал вам избегать атрибутов метеор с подчеркиванием впереди. Они могут быть удалены или изменены в будущих выпусках.

Смежные вопросы