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

Meteor HTTP.call on server side correct using?

本文关键字:服务器端 HTTP call Meteor      更新时间:2023-09-26

对不起我的英语。我是初级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);

您的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);
            }
        }
    );

}

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

我不熟悉如何处理同步版本的错误。你可以前往这里了解他们文档中的更多详细信息。