服务器端的Meteor HTTP.call正确使用?

时间:2014-10-13 07:39:58

标签: javascript meteor rss

抱歉我的英文。 我是JS初学者。我需要Meteor的帮助。 我尝试编写rss聚合器。 你能告诉我为什么这段代码对我来说不正常吗? rssContent始终未定义。 但是如果我在HTTP.call中尝试console.log(result.content),我会看到rss数据。 我需要在此文件中的另一个函数中传递rssContent来解析XML,但是我遇到了HTTP.call的问题

server.js代码:

var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];

var rssContent;

for (var i = 0; i < rssSources.length; i++) {
    HTTP.call('GET', rssSources[i],
        function(error, result) {
            try {
                rssContent = result.content;
            } catch (e) {
                console.log(e);
            }
        }
    );
}

console.log(rssContent);

2 个答案:

答案 0 :(得分:1)

您的rssContent变量始终未定义,因为您在回调(异步)非阻塞方法中调用它。而不是回调方法,你必须使用同步(阻塞)方法。 我建议你,不要为全局变量赋值,只要你得到http请求的响应,就把数据直接插入到数据库中。

阻止示例: -

var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];
var rssContent = "";
for (var i = 0; i < rssSources.length; i++) {
  var result = Meteor.http.call("GET", rssSources[i]);
  if(result.statusCode == '200' && result.content){
     rssContent += result.content;
  }
}
console.log(rssContent);

非阻止示例: -

var rssSources = ['http://news.yandex.ru/auto.rss'],

for (var i = 0; i < rssSources.length; i++) {
    HTTP.call('GET', rssSources[i],
        function(error, result) {
            try {
                //HERE INSERT YOUR DATA INTO THE DATABASE.INSTEAD OF ASSIGNING THE VALUE TO GLOBAL VARIABLE.
            } catch (e) {
                console.log(e);
            }
        }
    );

}

答案 1 :(得分:0)

在Meteor中有两种运行HTTP请求的方法。它默认同步运行。如果传递回调,它将异步运行。在这种情况下,假设这是服务器端代码,则更容易省略回调并将其视为同步(更不用说头痛IMO)。

var rssContent = [];

for (var i = 0; i < rssSources.length; i++) {
  var result = HTTP.call('GET', rssSources[i]);
  // error handling
  resultContent.push(result); 
}

我对处理同步版本的错误并不熟悉。你可以前往here for more details in their doc