2016-11-22 54 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

你好,谢谢你的回复。按照建议添加回调函数。当我运行代码时,控制台返回错误消息,说“回调不是函数”。你会如何解决这个问题? –

相关问题