繁体   English   中英

Express.js读取xml文件数据并将数据作为数组传递

[英]Express.js read xml file data and pass the data as an array

我正在尝试使用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;
}

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

您将如何解决? 请随意发表评论。 任何帮助或建议,不胜感激。

在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

如果错误在那里,您也应该处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM