2017-10-19 16 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!') 
}) 

エクストラエクスプレスルートコード。

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> 

私は実際にすべてを正しくセットアップしたいと考えていますが、すべてのものを新しいものにしています。アドバイスや援助は大歓迎です。見て、私を助ける時間をとってくれてありがとう!

+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

パーフェクト!それがトリックでした。初心者を助けてくれてありがとう! –

関連する問題