Node.js xml2jsparsing器未定义

所有,

我想通过xml2jsparsing一个HTTP响应XML,并运行到一个错误。 我试图按照这些说明: https : //programmerblog.net/parse-xml-using-nodejs/

我已经安装了模块,似乎正常运行。

我得到的错误。

parser.parseString(soapreplyx, function (err, result) { ^ ReferenceError: parser is not defined 

我的应用程序代码如下所示。

 // APP - INCLUDE const express = require('express') const path = require("path") const bodyParser = require("body-parser") const hbs = require('hbs') var xml2js = require('xml2js'); var parser = new xml2js.Parser(); // APP - DEFINITION const app = express() // APP - BUILD app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); app.engine('html', require('hbs').__express); app.set('view engine', 'html'); // EXPRESS ROUTE - INDEX app.get('/', function (req, res) { res.render(path.join(__dirname+ '/views/index.html'), { 'title': 'CUCM 2.0' }); }) // EXPRESS ROUTING - INCLUDE - CUCM MAPPER var routingextensions = require(__dirname+ '/routes/cucmmapper.js')(app); // APP - START app.listen(3000, function () { console.log('CUCM 2.0 listening on port 3000!') }) 

额外的快速路线代码。

 module.exports = function (app) { // FORM - SUBMIT - CUCMMAPPER app.post('/cucmmapper/submit', function (req, res) { // FORM - DATA COLLECTION var cucmpub = req.body.cucmpub; var cucmversion = req.body.cucmversion; var username = req.body.username; var password = req.body.password; // JS - VARIABLE DEFINITION var authentication = username + ":" + password; var soapreplyx = ''; var cssx = ''; //var parser = new xml2js.parser(); // HTTP.REQUEST - BUILD CALL var https = require("https"); var headers = { 'SoapAction': 'CUCM:DB ver=' + cucmversion + ' listCss', 'Authorization': 'Basic ' + new Buffer(authentication).toString('base64'), 'Content-Type': 'text/xml; charset=utf-8' }; // SOAP - AXL CALL var soapBody = new Buffer('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/11.5">' + '<soapenv:Header/>' + '<soapenv:Body>' + '<ns:listCss sequence="?">' + '<searchCriteria>' + '<name>%</name>' + '</searchCriteria>' + '<returnedTags uuid="?">' + '<name>?</name>' + '<description>?</description>' + '<clause>?</clause>' + '</returnedTags>' + '</ns:listCss>' + '</soapenv:Body>' + '</soapenv:Envelope>'); // HTTP.REQUEST - OPTIONS var options = { host: cucmpub, // IP ADDRESS OF CUCM PUBLISHER port: 8443, // DEFAULT CISCO SSL PORT path: '/axl/', // AXL URL method: 'POST', // AXL REQUIREMENT OF POST headers: headers, // HEADER VAR rejectUnauthorized: false // REQUIRED TO ACCEPT SELF-SIGNED CERTS }; // HTTP.REQUEST - Doesn't seem to need this line, but it might be useful anyway for pooling? options.agent = new https.Agent(options); // HTTP.REQUEST - OPEN SESSION let soapRequest = https.request(options, soapResponse => { soapResponse.setEncoding('utf8'); soapResponse.on('data', chunk => { soapreplyx += chunk }); // HTTP.REQUEST - RESULTS + RENDER soapResponse.on('end', () => { parser.parseString(soapreplyx, function (err, result) { var cssx = result['return']['css']; res.render('cucmmapper-results.html', { title: 'CUCM 2.1', soapreply: soapreplyx, css: cssx, }) }); }); }); // SOAP - SEND AXL CALL soapRequest.write(soapBody); soapRequest.end(); }); } 

这也是我从HTTPRequest获得的XML的一个例子。

 <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns:listCssResponse xmlns:ns="http://www.cisco.com/AXL/API/11.0"> <return> <css uuid="{E85C54E1-5737-7516-FFFC-14E97B1D0504}"> <description>description</description> <clause>blablabla</clause> <name>name</name> </css> <css uuid="{AFFC55A7-CD16-E250-09E8-9A12ABBE0C9E}"> <description>description</description> <clause>blablabla</clause> <name>name</name> </css> 

我真的希望我能正确地设置所有东西,但对于所有的东西都是新鲜的。 任何build议或帮助是非常受欢迎的。 感谢您抽出宝贵的时间来帮助我!

在node.js中,每个文件都是它自己的模块。 这意味着在一个模块中定义的variables不是全局的,除非您明确地导出它们,否则不会在其他文件中自动使用。

所以在你定义代码的时候:

 var xml2js = require('xml2js'); var parser = new xml2js.Parser(); 

在您的应用程序模块中,您将无法在您的额外路线模块中访问该模块,这正是错误所要说的。 解决方法是简单地将定义放在其他文件中:

 var xml2js = require('xml2js'); var parser = new xml2js.Parser(); module.exports = function (app) { // FORM - SUBMIT - CUCMMAPPER app.post('/cucmmapper/submit', function (req, res) { // etc... }