簡體   English   中英

服務器端的流星HTTP.call正確使用嗎?

[英]Meteor HTTP.call on server side correct using?

對不起我的英語不好。 我是初學者JS開發人員。 我需要流星的幫助。 我嘗試編寫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);

您的rssContent變量始終是未定義的,因為您正在回調(async)非阻塞方法中調用它。 代替回調方法,您必須使用sync(blocking)方法。 我建議您,不要給全局變量賦值,每當您收到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);
            }
        }
    );

}

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

我對處理同步版本的錯誤不熟悉。 您可以在此處查看其文檔中的更多詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM