簡體   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