在NodeJS中使用node-soap时出错

时间:2015-05-08 19:13:45

标签: xml node.js web-services soap wsdl

我正在尝试使用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

3 个答案:

答案 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)
        }
      })
    }
  })

我希望这对您有用!