0

背景

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

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

问题

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

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

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

例子

这将打印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。当我尝试将函数返回的对象传递给这样的变量时,这会使值空,

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);

这返回null。但是,如果我改为使用 console.log(result) 或使用 return 然后在函数之外尝试它会返回这个,

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

1 回答 1

1

requestReport 是异步的。它不返回任何内容,因此响应未定义。

您必须使用回调。

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);
});
于 2017-02-03T10:08:28.000 回答