2015-06-16 4 views
-1

У меня есть массив внутри моего объекта, который содержит другой объект, и я пытаюсь выборочно обновлять один из этих объектов на основе значения (термина) внутри него. Тем не менее, я терплю неудачу, каждый раз, когда я добавляю код обновления, функция просто кажется переданной на этот вызов и не проходит через остальную часть функции, я могу сказать, что ни один из вызовов console.log после того, как эта точка вызвана ,Meteor update Mongo Sub Collection, не продолжение

Вот структура объекта я Fetching:

{ "_id" : "KH5SsND7f9urKSEyz", 
"eventName" : "macmillan", 
"twitterEnabled" : true, 
"instagramEnabled" : false, 
"vineEnabled" : false, 
"fetchCount" : 2, 
"enabled" : true, 
"searchTerms" : [ { "term" : "badger", "latestTwitter" : 0, "latestInstagram" : 0, "latestVine" : 0 }, { "term" : "freedom", "latestTwitter" : 0, "latestInstagram" : 0, "latestVine" : 0 } ] 
} 

я могу получить доступ и регистрации данного объекта на консоль с помощью вызова, если код событие правильно установлено в функции.

console.log(HTLEvents.find({_id: eventID})); 

Однако, когда я вызываю это, чтобы обновить метод, он просто останавливается, никаких ошибок не происходит.

HTLevents.update({_id : eventID , "searchTerms.term" : searchTerm } , 
{$set : {"searchTerms.$.latestTwitter" : latest} } , 
false , 
true) 

У меня есть тройной флажок, и все используемые переменные не определены и имеют правильные значения.

Вот полная функция, это называется использованием Meteor.call из SyncedCron повторяющегося события

Meteor.call('searchTermsUpdateLatest', eventList[eventi]._id, returnValue[i][1].searchedTerm, returnValue[i][1].networkSearched, returnValue[i][1].latestID, function (error, eventList) {function . . . . } 

Как она вызывается с обратным вызовом он работает Async.

HTLEvents = new Mongo.Collection('htlevents'); 

Meteor.methods({ 
    fetchEnabledEvents: function() { 
     return HTLEvents.find({enabled: true}, {}).fetch(); 
    }, 
    searchTermsUpdateLatest: function(eventID, searchTerm, network, latest, callback) { 
     console.log('Updating:' + eventID); 
     console.log(eventID + " " + searchTerm + " " + network + " " + latest); 
     console.log(HTLEvents.find({_id: eventID})); 
     console.log(HTLEvents.find({_id: eventID , "searchTerms.term" : searchTerm})); 
     var err = undefined 
     if (eventID && searchTerm && network && latest) { 
      console.log("All parameters set, now updating the " + network + " for " + searchTerm); 
      if(network === "twitter"){ 
       console.log("Updating twitter latest id for " + searchTerm); 
       HTLevents.update({_id : eventID , "searchTerms.term" : searchTerm } , 
       {$set : {"searchTerms.$.latestTwitter" : latest} } , 
       false , 
       true) 
      } else if (network == "instagram") { 
       console.log("Updating instagram latest id for " + searchTerm); 
       HTLevents.update({_id : { _str: eventID } , "searchTerms.term":searchTerm} , {$inc: {"searchTerms.$.latestInstagram": latest}}); 
      } else if (network == "vine") { 
       console.log("Updating vine latest id for " + searchTerm); 
       HTLevents.update({_id : { _str: eventID } , "searchTerms.term":searchTerm} , {$inc: {"searchTerms.$.latestVine": latest}}); 
      } 
     } else { 
      err = "Unable to update latestID, one or more values not set in method call." 
      console.log("Unable to update latestID, one or more values not set in method call.") 
     } 
     console.log('Updated:') 
     console.log(HTLevents.find({_id : eventID})); 
     callback(); 
    }, 
}); 

Я ожидаю, что я делаю что-то глупое, поэтому извините заранее, но я очень новой для обоих Метеор и Javascript.

Благодаря

Gareth

ответ

0

В отличии от нормального Node.js кода, вы явно не добавить функцию обратного вызова для вашей подписи методы в метеоре. Ваше определение метода должно выглядеть следующим образом:

searchTermsUpdateLatest: function(eventID, searchTerm, network, latest) {...} 

Кроме того, вы не вызвать обратный вызов в конце функции (удалить последнюю строку). Если метод должен вернуть значение, вы можете явно сделать это в конце вашей функции.

Дополнительную информацию и примеры см. В документации для Meteor.call.

Обратите внимание, что если вы звоните с SyncedCron, то он работает на вашем сервере, и вам, вероятно, понадобится асинхронный стиль вызова (не передавайте обратный вызов).

+0

Привет, Дэвид, спасибо за ответ, да, этот код будет работать только на сервере. Я думаю, что обратный вызов действительно не нужен, поскольку я мог бы сделать вставку в методе. Тем не менее, я удалил ссылку на обратный вызов и даже добавил следующее к самой верхней части функции, и функция просто кажется остановлена ​​на этой строке и не идет дальше, без ошибок, ничего не останавливается. Я даже сильно закодировал значения, и я просто пытаюсь обновить основной объект, а не что-либо в подвале. –

+0

HTLevents.update ({_id: 'KH5SsND7f9urKSEyz'}, {$ set: {"enabled": false}}); –

+0

Да, конечно, это странно ... Я не могу придумать, почему метод просто останавливается в середине операции БД. Является ли ваш процессор на 100% или ваш жесткий диск сходит с ума или что-то в этом роде? Возможно, просто попробуйте удалить строки кода, пока не получите что-то для работы. –