簡體   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