Meteor更新Mongo Sub Collection,没有继续

时间:2015-06-16 21:08:36

标签: javascript node.js mongodb meteor

我的对象中有一个包含其他对象的数组,我试图根据其中的值(术语)有选择地更新其中一个对象。然而,我失败了,每次我添加更新代码时,函数似乎只是在那个调用处进行,而不是通过函数的其余部分继续,我可以告诉,因为在该点之后没有调用console.log调用

这是我正在获取的对象的结构:

{ "_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 } ] 
}

如果在函数中正确设置了eventID,我可以通过调用访问该对象并将其记录到控制台。

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

然而,当我调用它来更新方法时,只是停止,没有错误,只是没有继续。

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

我已经进行了三次检查,并且所有使用的变量都没有未定义且值正确。

这是完整的函数,使用来自SyncedCron重复事件的Meteor.call调用

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

我完全相信我做的事情很蠢,所以提前抱歉,但我对Meteor和Javascript都很陌生。

由于

加雷

1 个答案:

答案 0 :(得分:0)

与普通的node.js代码不同,您不会在meteor中向方法签名显式添加回调。您的方法定义应如下所示:

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

同样,您不会在函数末尾调用回调(删除最后一行)。如果该方法应返回一个值,则可以在函数末尾显式执行该操作。

有关详细信息和示例,请参阅Meteor.call的文档。

请注意,如果您正在从SyncedCron拨打电话,那么它正在您的服务器上运行,您可能需要一种异步呼叫方式(不要通过回调)。