xml2js不返回已解析的JSON

时间:2019-04-10 18:56:12

标签: javascript node.js

我在这里想念什么?即使console.log正常工作,也不从parseXML方法返回JSON。而是返回undefined。

 id value val_0_100 val_100_200 val_200_300
ABC   150       100          50           0
XYZ   300       100         100         100

2 个答案:

答案 0 :(得分:1)

问题是parseString的结果是异步返回的,但是您不能异步处理函数调用及其结果。

您可能想要查看异步编程和回调在Node.js和JavaScript中的工作方式。

答案 1 :(得分:1)

您可以通过promise和async / await来完成这项工作:

function parseXML() {

var parseString = require('xml2js').parseString;

  var str = '<Customers>\
  <Customer>\
      <first>JIM</first>\
      <last>BEAM</last>\
      <address>22. JIM. RD.</address>\
      <age>24</age>\
      <age2>2.0</age2>\
      <Phone>206-555-0144</Phone>\
  </Customer>\
</Customers>'
return new Promise((resolve, reject) => {
  parseString(str, function (err, result) {
    console.log(JSON.stringify(result));  //<<<<<<<RETURNS THE JSON I EXPECTED
    resolve(JSON.stringify(result))
  });
})
}

app.get('/*', async (request, response) => {
  var json = await parseXML();
  console.log(json)     //<<<<<<RETURNS UNDEFINED
  var obj = JSON.parse(json);
  console.log(obj);
  var jsonres = obj.Customers.Customer[0]["first"];

  response.send(['Hello from Express!', jsonres])
})

编辑:对不起,我想我应该在这里添加一些解释。

parseString函数具有一个异步回调,直到该函数完成处理后才会触发,因此您的代码无法正常工作的原因是因为您试图在完成处理之前访问数据。这是正在发生的步骤:

  1. 调用parseXML函数
  2. 调用parseString函数(这将启动异步处理)
  3. 尝试并记录存储在json变量中的数据,该变量应保存parseXML调用的结果。这是未定义的,因为parseXML函数不会返回任何内容,因此未定义的信息会记录到控制台。您在parseString回调中的返回值从回调函数而不是原始函数返回一个值。此外,它甚至在您尝试访问json变量
  4. 中的数据后才被调用。
  5. 传递给parseString函数的回调函数完成,您会看到期望记录到控制台的json。

我的更改基本上将您的parseString包装在一个promise中,该promise会在回调完成时进行解析,并从parseXML函数返回该promise。这使您可以使用async / await来获取异步处理的结果。您也可以写parseXML().then(data => { //process data here }