【问题标题】:Express.js read xml file data and pass the data as an arrayExpress.js 读取 xml 文件数据并将数据作为数组传递
【发布时间】:2016-11-22 01:41:44
【问题描述】:

我正在尝试使用 Express.js 构建一个 Node.js Web 应用程序,它从外部 xml 文件中读取值,并将所有数据值存储在一个数组中。有多个要读取的 xml 文件,因此重复相同的过程。

function loadSoftwareRequestXML(filename){
var xmlparser = new xml2js.Parser();
var software_request = new Array();
var filepath = "/project_requests/" + filename;
fs.readFile(filepath, "utf-8", function(error, values){
    xmlparser.parseString(values, function(error, xmlfile){
        var xmldata = xmlfile;
        date_requested = xmldata.ProjectRequest.DateRequested;
        client_org = xmldata.ProjectRequest.ClientOrganization;
        proposed_budget = xmldata.ProjectRequest.ProposedBudget;
        contact_name = xmldata.ProjectRequest.ContactName;
        delivery_date = xmldata.ProjectRequest.DeliveryDate;
        requirements = xmldata.ProjectRequest.UserRequirements;
        //software_request = [date_requested, client_org, proposed_budget, contact_name, delivery_date, requirements];
        software_request.push(date_requested);
        software_request.push(client_org);
    });
});
console.log(software_request);
return software_request;
}

我遇到的问题是,对于存储检索到的 xml 数据的数组变量“software_request”,它在 xmlparser 函数内部时可以工作。但是当它在 return 语句之前使用 console.log() 跟踪时,它变成了一个空数组。

你会如何解决这个问题?请随意发表评论。任何帮助或建议表示赞赏。

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

在 node.js 中,I/O 是异步的,因此像 readFileparseString 这样的函数不会在调用它们的同一事件循环中完成。这意味着在它们之后编写的代码将首先被调用。

当一个异步事件完成时,有很多方法可以表示它的完成并对它做出反应。回调在 node.js 中很常见。当异步事件完成时,将调用作为参数传递给这些函数的 function (error value)

fs.readFile(file, cb);
return software_request; // this gets called before `cb`

要保持这种模式,您可以将回调传递给loadSoftwareRequestXML

function loadSoftwareRequestXML(filename, cb){
    const xmlparser = new xml2js.Parser();
    const software_request = [];
    const filepath = "/project_requests/" + filename;
    fs.readFile(filepath, "utf-8", function(error, values){
        xmlparser.parseString(values, function(error, xmlfile){
            /* snip */
            console.log(software_request);
            cb(error, software_request);
        });
    });
}

基本上,您不能通过回调return

如果存在错误,您还应该处理它们。

【讨论】:

  • 您好,感谢您的回复。我已经按照建议向函数添加了回调。当我运行代码时,控制台返回错误消息“回调不是函数”。你会如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多