JavaScript中如何封装xml2js?导出的XML转JSON函数返回undefined但可打印结果
解决xml2js导出函数返回undefined但console.log能输出的问题
这个问题我太熟了!核心原因就是xml2js的parseString是异步操作,你的外层函数没等解析完成就已经执行完返回了,所以拿到undefined,但回调里的console.log是在解析完成后才触发的,所以能看到正确结果。
先看看你大概率写的错误代码是什么样的:
const xml2js = require('xml2js'); const parser = new xml2js.Parser(); function parseXmlToJson(xml) { parser.parseString(xml, (err, result) => { if (err) throw err; console.log(result); // 这里能正常输出,因为回调是异步触发的 return result; // 注意:这个return是回调函数的返回,不是外层parseXmlToJson的返回! }); // 外层函数没有任何return语句,默认返回undefined } module.exports = parseXmlToJson;
下面给你两种常用的解决方案,选适合你的就行:
方案一:用回调函数传递结果
把回调作为参数传入函数,在解析完成后调用回调返回结果:
const xml2js = require('xml2js'); const parser = new xml2js.Parser(); function parseXmlToJson(xml, callback) { parser.parseString(xml, (err, result) => { if (err) { return callback(err, null); // 错误时传递错误信息 } callback(null, result); // 成功时传递解析后的JSON }); } module.exports = parseXmlToJson; // 使用示例 // parseXmlToJson(yourXmlString, (err, jsonResult) => { // if (err) { // console.error('解析出错:', err); // return; // } // console.log(jsonResult); // });
方案二:用Promise封装(推荐现代JS写法)
把函数封装成Promise,这样可以用async/await来处理异步逻辑,代码更直观:
const xml2js = require('xml2js'); const parser = new xml2js.Parser(); function parseXmlToJson(xml) { return new Promise((resolve, reject) => { parser.parseString(xml, (err, result) => { if (err) { reject(err); // 解析失败时reject错误 } else { resolve(result); // 解析成功时resolve结果 } }); }); } module.exports = parseXmlToJson; // 使用示例(async/await写法) // async function handleXml() { // try { // const jsonResult = await parseXmlToJson(yourXmlString); // console.log(jsonResult); // } catch (err) { // console.error('解析出错:', err); // } // } // handleXml();
如果你的xml2js版本比较新,还可以直接用它提供的Promise版本方法parseStringPromise,代码更简洁:
const xml2js = require('xml2js'); async function parseXmlToJson(xml) { const parser = new xml2js.Parser(); try { return await parser.parseStringPromise(xml); } catch (err) { throw err; } } module.exports = parseXmlToJson;
总结一下:异步操作不能像同步函数那样直接return结果,必须通过回调、Promise这类方式来处理结果的返回时机,这样就能解决函数返回undefined的问题啦!
内容的提问来源于stack exchange,提问作者Nikolay Gospodinov
相关产品推荐
相关产品推荐

