【发布时间】:2020-06-06 07:06:56
【问题描述】:
我正在尝试使用 Zapier Javascript 代码步骤来调用对远程服务器的 HTML 查询。服务器返回一个 XML 响应体,需要进一步解析为 JSON 对象。
首先,我很难找到一种快速的方法来进行这种转换。有一些模块/包可以使用 JQuery 和其他框架,Zapier 不支持这些模块/包(Zapier 引擎支持 NodeJS 8.10.x,没有很多额外的模块/包)。似乎已经为返回 JSON 对象的案例创建了标准文档。
我有以下代码,我也遇到了与此相关的错误:
编辑 (06/05): 根据评论,我将调用代码发布到方法 xml2JSON。
let url = '<https://remote-sever-base-url?method, params etc.>'
let response = await fetch(url);
if (response.ok) { // if HTTP-status is 200-299
// Response body is in XML format. No JSON available.
var xmlDoc = await response.text();
var jsondata = xmlToJson(xmlDoc);
console.log(jsonData);
} else {
alert("HTTP-Error: " + response.status);
}
// Changes XML to JSON
function xmlToJson(xml) {
// Create the return object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) { // text
obj = xml.nodeValue;
}
// do children
if (xml.hasChildNodes()) {
for(var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof(obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
};
错误:
The run javascript could not be sent to Code by Zapier.
TypeError: xml.hasChildNodes is not a function
仅供参考 - 传入的 XML 在其结构上非常扁平且可预测。
<result>
<record>
<field1>
<field 2>
....fields continue
</record>
...... list continues
</result>
因此,DOM 确实有子节点,虽然不是很深的树。 此外,由于这些是关系数据库中的记录,结果集中的所有记录结构都是相似的,尽管在不同的 POST 之间它们会有所不同。希望这可以澄清。
【问题讨论】:
-
您的代码步骤中还有其他代码吗?你如何调用
xmlToJson函数?您传递给函数的对象是否具有.hasChildNodes属性? -
调用代码基本上是发送一个HTTP请求。这是附加了调用逻辑的代码块。
标签: javascript zapier