我正在尝试使用node-soap来使用WSDL。我在我的控制器中使用它如下:
this.getSoap = function (request, response) {
var soap = require('node-soap');
var url = 'http://identificacion.uci.cu/servicios/v5/servicios.php';
var args = { IdExpediente: '016381' };
soap.createClient(url, function (err, client) {
client.ObtenerFotoDadoIdExpediente(args, function (err, result) {
if (err) {
throw err
client.describe();
} else
console.log(result);
});
});
return response.render('index', {
variable: 'valor'
});
};
当我打电话时,我在浏览器中收到此回复:
对象函数SOAPClient(options,fn){fn = this.fn = fn; options = this.options = _.extend({},defaults,options); var deferred; this.namespaces =''; this.methods =''; this.body =功能 (选项){return“”+ “http://schemas.xmlsoap.org/soap/envelope \ / \”“+ “xmlns:xsi = \”http://www.w3.org/1999/XMLSchema-instance\“”+ “xmlns:xsd = \”http://www.w3.org/1999/XMLSchema\“”+ options.namespaces +“>” +“”+ options.methods +“”+''; }; this.newRequest();归还这个; } 没有 方法'createClient'
TypeError: Object function SOAPClient(options, fn) {
fn = this.fn = fn;
options = this.options = _.extend({}, defaults, options);
var deferred;
this.namespaces = '';
this.methods = '';
this.body = function (options) {
return "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<SOAP-ENV:Envelope " +
"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope\/\" " +
"xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" " +
"xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\" " +
options.namespaces +
">" +
"<SOAP-ENV:Body>" +
options.methods +
"</SOAP-ENV:Body>" +
'</SOAP-ENV:Envelope>';
};
this.newRequest();
return this;
} has no method 'createClient'
at Object.getSoap (/home/heimdall/Proyectos/myNODE/src/SoapModule /controller/soapController.js:19:10)
at module.exports (/home/heimdall/Proyectos/myNODE/src/SoapModule/resources/config/routing.js:16:20)
at Layer.handle [as handle_request] (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/layer.js:82:5)
at next (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/route.js:110:13)
at Route.dispatch (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/route.js:91:3)
at Layer.handle [as handle_request] (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/layer.js:82:5)
at /home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/index.js:267:22
at Function.proto.process_params (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/index.js:321:12)
at next (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/router/index.js:261:10)
at expressInit (/home/heimdall/Proyectos/myNODE/node_modules/express/lib/middleware/init.js:23:5)
我使用此文档:Github project
现在我的文件看起来:
var soap = require('soap');
// url del wsdl
this.getSoap = function (request, response) {
var url = 'http://identificacion.uci.cu/servicios/v5/servicios.php';
var args = { IdExpediente: '016381' };
soap.createClient(url, function (err, client) {
if (err) {
console.log(err);
} else {
client.ObtenerFotoDadoIdExpediente(args, function (err, result) {
if (err) {
throw err
client.describe();
} else
console.log(result);
});
}
});
在我的服务器中获取此信息:
无法设置属性'描述'为null
答案 0 :(得分:1)
首先要做的事情 - 当一个错误被抛出来指定一个对象“没有方法”时,我们希望有一个给定名称,这通常表明对象(或类)未能通过定义或不正确的要求声明(不一定是你不正确地使用它)。
查看您提供的文档链接,我所引发此问题的最初项目是require('node-soap');
语句。虽然该项目在github上被称为“node-soap”,但文档中提供的require语句表明该软件包的名称为“soap”。
尝试更换:
var soap = require('node-soap');
使用:
var soap = require('soap');
此外,Node.js社区认为最佳做法是不在函数内部require()
包,而是在任何函数或类定义之外,例如在源文件的顶部。
如果能解决问题,请告诉我们 - 干杯。
这是一个单独的问题(你的第一个问题已经解决):
从文档中,client.describe()
方法用于提供“作为JavaScript对象的服务,端口和方法的描述”。
测试显示.describe()
方法的使用仅在断言不存在错误时才合法。当错误存在时,您的代码当前会尝试使用describe()
方法。
if (err) {
throw err
client.describe();
}
您的新错误现在为Cannot set property 'descriptions' of null
,因为尚未提供对象来创建定义,可能是连接出错,请尝试检查您的网址是否有效(即发送回复的肥皂包可以使用),否则describe()
没有任何内容。
答案 1 :(得分:0)
我改变了网络服务的网址:
在: http://identificacion.uci.cu/servicios/v5/servicios.php
在: http://rhoda.uci.cu/roa.php/interoperability/session?wsdl
错误消失,可能此模块仅适用于?wsdl ,而不适用于 .php
答案 2 :(得分:0)
您必须检查,然后用下一个结构完成端点
serviceURL = http://localhost:8080/Evaluator?wsdl
也请检查
enter code here
await soap.createClient(serviceURL, (err: any, client: any) => {
if (err) {
reject(err)
} else {
client[method](payload, (errr: any, result: any) => {
if (errr) {
reject(errr)
} else {
resolve(result)
}
})
}
})
我希望这对您有用!