2016-11-22 56 views
0

我正嘗試使用Express.js構建Node.js Web應用程序,該應用程序從外部xml文件讀取值,並將所有數據值存儲在一個數組。有多個XML文件可以讀取,因此重複執行相同的過程。Express.js讀取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()跟蹤它,它將變成一個空數組。

你會如何解決這個問題?請隨意發表評論。任何幫助或建議表示讚賞。

+0

http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call –

回答

0

在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回調。

你也應該處理錯誤,如果他們在那裏。

+0

你好,謝謝你的回覆。按照建議添加回調函數。當我運行代碼時,控制檯返回錯誤消息,說「回調不是函數」。你會如何解決這個問題? –

相關問題