2017-10-19 118 views
1

所有,Node.js的xml2js解析器未定義

我試圖解析通過xml2js 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!') 
}) 

Extra Express Route code。

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> 

我真的希望我能正確設置所有東西,但對於所有東西都是新的JS。任何建議或幫助是非常受歡迎的。感謝您抽出寶貴時間來幫助我!

+1

變量的作用域爲其各自的文件。您需要在路由器文件中創建解析器。 – skirtle

回答

0

在node.js中,每個文件都是它自己的模塊。這意味着在一個模塊中定義的變量不是全局變量,除非您明確地導出它們,否則不會在其他文件中自動提供。

在你的代碼

所以,當你定義:

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... 
} 
+0

完美!那就是訣竅。非常感謝您幫助初學者! –