我在这里想念什么?即使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
答案 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函数具有一个异步回调,直到该函数完成处理后才会触发,因此您的代码无法正常工作的原因是因为您试图在完成处理之前访问数据。这是正在发生的步骤:
我的更改基本上将您的parseString包装在一个promise中,该promise会在回调完成时进行解析,并从parseXML函数返回该promise。这使您可以使用async / await来获取异步处理的结果。您也可以写parseXML().then(data => { //process data here }