使用 Node.js 将 XML 文件传递​​给 xml2js

Passing XML File To xml2js With Node.js

背景

我从一个大型 XML 响应中提取了一些样本数据,我将在我的应用程序中使用它。我决定将 xml 保存到我的应用程序中的 response.xml 文件中,这样我就可以解析数据而无需向 api 发出一堆不必要的请求。

我将使用 xml2js 将 xml 响应转换为 JS Object

问题

我已经能够打开文件并 console.log() 它。

我已经能够 运行 xml2js 通过向它传递一个小的 xml 字符串,我也 console.log() 它。

但我只能在 xml2js 创建对象后 console.log() 文件。无论我尝试什么,在使用 return 或尝试在对象的初始创建之外传递数据时,我都会继续得到空值。

例子

这会将 xml tree 打印到控制台,

var fs = require('fs');
var openFile = fs.readFile('./response.xml', 'utf8', function (err,data) {
    if (err) {
        return console.log(err);
    }
    console.log(data);
});

function requestCreditReport() {
    return openFile;
}

requestCreditReport();

这会打印一个小的 xml string 来控制台静态添加 xml2js,

var parseString = require('xml2js').parseString;

var xml = "<root>Hello xml2js!</root>";

parseString(xml, function (err, result) {
    console.dir(result);
});

问题

在以下方法之外创建对象后,如何使用它。最初创建时,我可以将它输出到控制台,但似乎无法在 console.log() 之外访问它。在下面的示例中,我正在尝试 return result。当我尝试将函数 returned 的对象传递给这样的变量时,这会留下空值,

var response = requestReport();

最近尝试,

var fs = require('fs');
var parseString = require('xml2js').parseString;

function requestReport() {
    fs.readFile('./response.xml', 'utf8', function (err,data) {
        if (err) {
            return console.log(err);
        }
        return parseString(data, function (err, result) {
            return result;
        });
    });
}

var response = requestReport();

console.log(response);

这个returns null。但是如果我 console.log(result) 而不是或使用 return 然后在函数之外尝试它 returns this,

{ RESPONSE_DATA:
   { '$': { MYAPI: '0.0.0' },
     DETAILS: [ [Object] ],
     DETAILS_ACCOUNT: [ [Object] ],
     RESPONSE: [ [Object] ] } }

requestReport 是异步的。它没有 return 任何内容,因此响应未定义。

你必须使用回调。

var fs = require('fs');
var parseString = require('xml2js').parseString;

function requestReport(callback) {
  fs.readFile('./response.xml', 'utf8', function(err, data) {
    if (err) return callback(err);
    parseString(data, callback);
  });
}

requestReport(function(err, result) {
  if (err) return console.error(err);
  console.log(result);
});