【问题标题】:Node js script with ajax xml request not working带有ajax xml请求的节点js脚本不起作用
【发布时间】:2016-04-14 03:32:08
【问题描述】:

我有一个使用 node 运行的简短 javascript 脚本(例如node runScript.js)。在其中,我使用tiptoe,并且尝试了各种方法来检索 xml 文件,但均未成功。

tiptoe(
 	function getESData() {
 		var json;
                // get the json data.
	        for (var i = 0; i < json.hits.hits.length; i++) {	        	
	        	for (var multiId = 0; multiId < json.hits.hits[i]._source.multiverseids.length; multiId++) {
	        		var priceUrl = "http://partner.tcgplayer.com/x3/phl.asmx/p?pk=TCGTEST&s="+setName+"&p="+json.hits.hits[i]._source.name
					console.log("fetching " +priceUrl );
                  
                    // attempt 1:
					var x = new XMLHttpRequest();
					console.log("working"); // THIS CONSOLE LOG NEVER SHOWS UP.
					x.open("GET", priceUrl, true);
					console.log("working");
					x.onreadystatechange = function() {
						if (x.readyState == 4 && x.status == 200)
						{
							console.log(x.responseXML);
						}
					};
					x.send();
                  
                    // attempt 2:
					$.ajax({
						url: priceUrl,
						success: function( data ) {
						  console.log(data);
						}
					});
                  
                    // attempt 3:                  
					$.get(priceUrl, function(data, status){
				        console.log("Data: " + data + "\nStatus: " + status);
				    });
				}
			}
	    });
 	}
);

在打印第一个 console.log 后,我在其中记录了 url 以确保它有效,所有这些方法都静默失败(显然我在测试时注释掉了除一个之外的所有方法,我不会一次使用所有三个)。 (带有变量的 url 解析为:http://partner.tcgplayer.com/x3/phl.asmx/p?pk=TCGTEST&amp;s=Ice Age&amp;p=Arnjlot's Ascent,当我在浏览器中测试它时,它绝对返回 xml,所以我知道这是有效的)。是踮起脚尖吗?

编辑:尝试 4:

    $().ready(function () {
      console.log('working');
	  $.get(priceUrl, function (data) {
	    console.log(data);
	  });
	});

在“工作”日志出现在我的控制台之前,这也会失败。不确定这是否重要,但我也在为此使用 git bash 控制台。

编辑2:答案是使用request,方式如下:

request(priceUrl, function(error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
})

效果很好。

【问题讨论】:

  • url 编码你的字符串 man
  • 我猜问题出在你的 for 循环上。将脚尖带入 for 循环将为您完成任务,因为脚尖一个接一个地按串行顺序执行每个函数。

标签: javascript jquery ajax xml node.js


【解决方案1】:

又一个 Access-Control-Allow-Origin 问题。我试过你给的链接:

XMLHttpRequest 无法加载 http://partner.tcgplayer.com/x3/phl.asmx/p?pk=TCGTEST&s=Ice%20Age&p=Arnjlot%27s%20Ascent。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'null'。

关于可能的解决方案,有一个有据可查的 post here

在您的情况下,您可以使用 jsonp 数据类型作为您的请求,这仅适用于 jQuery 1.12/2.2+

var url = "http://partner.tcgplayer.com/x3/phl.asmx/p?pk=TCGTEST&s=Ice Age&p=Arnjlot's Ascent";

$.get({
    url: url,
    dataType: 'jsonp text xml'
}, function(data, status) {
    console.log("Data: " + data + "\nStatus: " + status);
});

【讨论】:

  • 那也行不通。我运行node runScript.js,得到我的第一个控制台日志,然后什么都没有。我用我使用的东西更新了我的 OP。
  • @IronWaffleMan 我很困惑,您使用的是 jQuery 还是 NodeJS?是服务器端脚本还是客户端脚本?
  • 我的本地目录中有一个名为 runScript.js 的脚本。在控制台中,我导航到那里并执行node runScript.js。所以我相信你的问题的答案是两者兼而有之?我认为这符合客户端的要求。
  • 不,这符合服务器端的条件。客户端脚本在浏览器中运行。如果您使用的是 NodeJS,请不要使用 jQuery 或 XMLHttpRequest 来处理您的请求,请使用 request 或(更好)request-promise 之类的东西。另外,你不需要踮起脚尖,你应该看看 Promise.all() (它是 NodeJS 的原生函数)。
  • 啊,完美,request 成功了。我将更新我的 OP 以澄清正确的答案。谢谢:D
猜你喜欢
  • 1970-01-01
  • 2014-03-12
  • 2017-08-08
  • 1970-01-01
  • 2017-12-24
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多