繁体   English   中英

xml2js不返回已解析的JSON

[英]xml2js is not returning parsed JSON

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

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>'

parseString(str, function (err, result) {
  console.log(JSON.stringify(result));  //<<<<<<<RETURNS THE JSON I EXPECTED
  return JSON.stringify(result);
});
}

app.get('/*', (request, response) => {
  var json=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的结果是异步返回的,但是您不能异步处理函数调用及其结果。

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

您可以通过诺言和异步/等待使这项工作:

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. 传递给parseString函数的回调函数完成,您会看到期望记录到控制台的json。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM