Javascript Node.js xml2js解析器未定义
全部, 我试图通过xml2js解析HTTP响应XML,但遇到了一个错误。我正在尝试按照以下说明进行操作: 我确实安装了模块,并且似乎运行正常 我得到的错误Javascript Node.js xml2js解析器未定义,javascript,node.js,xml,httprequest,xml2js,Javascript,Node.js,Xml,Httprequest,Xml2js,全部, 我试图通过xml2js解析HTTP响应XML,但遇到了一个错误。我正在尝试按照以下说明进行操作: 我确实安装了模块,并且似乎运行正常 我得到的错误 parser.parseString(soapreplyx, function (err, result) { ^ ReferenceError: parser is not defined 我的应用程序代码如下所示 // APP - INCLUDE const express = require('express') co
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();
});
}
module.exports=函数(应用程序){
//表格-提交-cucmapper
应用程序发布('/cucmapper/submit',功能(请求、回复){
//表格-数据收集
var cucmpub=req.body.cucmpub;
var cucmversion=req.body.cucmversion;
var username=req.body.username;
var password=req.body.password;
//JS-变量定义
var身份验证=用户名+“:”+密码;
var soapreplyx='';
var cssx=“”;
//var parser=new xml2js.parser();
//HTTP.REQUEST-BUILD调用
var https=要求(“https”);
变量头={
“SoapAction”:“CUCM:DB ver=”+cucmversion+“listCss”,
'Authorization':'Basic'+新缓冲区(身份验证).toString('base64'),
“内容类型”:“text/xml;charset=utf-8”
};
//SOAP-AXL调用
var soapBody=新缓冲区(“”)+
'' +
'' +
'' +
'' +
'%' +
'' +
'' +
'?' +
'?' +
'?' +
'' +
'' +
'' +
'');
//HTTP.REQUEST-选项
变量选项={
主机:cucmpub,//CUCM发布服务器的IP地址
端口:8443,//默认CISCO SSL端口
路径:'/axl/',//axl URL
方法:'POST',//POST的AXL要求
headers:headers,//HEADER变量
rejectUnauthorized:false//接受自签名证书需要
};
//HTTP.REQUEST-似乎不需要这一行,但它对池可能很有用?
options.agent=新的https.agent(选项);
//HTTP.REQUEST-打开会话
让soapRequest=https.request(选项,soapResponse=>{
setEncoding('utf8');
soapResponse.on('data',chunk=>{
soapreplyx+=块
});
//HTTP.REQUEST-结果+呈现
soapResponse.on('end',()=>{
parser.parseString(soapreplyx,函数(err,result){
var cssx=result['return']['css'];
res.render('cucmapper-results.html'{
标题:“CUCM 2.1”,
soapreply:soapreplyx,
css:cssx,
})
});
});
});
//SOAP-发送AXL调用
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>
描述
喋喋不休
名称
描述
喋喋不休
名称
我真的希望我设置的一切都正确,但我是新的所有东西。欢迎任何建议或帮助。谢谢你花时间来看我,帮我解决问题 在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...
}
在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...
}
变量的作用域为其各自的文件。您需要在路由器文件中创建解析器。变量的作用域是它们各自的文件。您需要在路由器文件中创建解析器。完美!这就成功了。非常感谢您对初学者的帮助!完美的这就成功了。非常感谢您对初学者的帮助!