[英]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函数具有一个异步回调,该异步回调直到函数完成处理后才会触发,因此您的代码无法正常工作的原因是因为您试图在完成处理之前访问数据。 这是正在发生的步骤:
我所做的更改基本上将您的parseString包装在一个promise中,该promise在回调完成时解析,并从parseXML函数返回该promise。 这使您可以使用async / await来获取异步处理的结果。 您也可以编写parseXML().then(data => { //process data here }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.