【问题标题】:SOAP node returns error Target-Namespace "undefined" already in use by another SchemaSOAP 节点返回错误 Target-Namespace "undefined" already in use by another Schema
【发布时间】:2016-09-22 09:10:37
【问题描述】:

我正在尝试为俄罗斯邮政写一个客户端以进行跟踪。它使用 SOAP WSDL。 我至少要得到客户端对象。

 'use strict'
let soap=require('soap'),
url = 'https://tracking.russianpost.ru/rtm34?wsdl',
argums={}

soap.createClient(url,argums,function(err, client){
    console.log(client) 
})

但它返回错误

Target-Namespace "undefined" already in use by another Schema!
Target-Namespace "undefined" already in use by another Schema!
Target-Namespace "undefined" already in use by another Schema!
Target-Namespace "undefined" already in use by another Schema!
Target-Namespace "undefined" already in use by another Schema!
/home/st.cremer/Сайты/get-posts/node_modules/soap/lib/wsdl.js:481
    this.element = schema.elements[nsName.name];
                         ^

TypeError: Cannot read property 'elements' of undefined

谁能解释一下请求应该是什么样子是什么意思?

【问题讨论】:

    标签: node.js soap wsdl


    【解决方案1】:

    已解决。问题的解决方法。 首先,我使用修改后的原始 wsdl 文件而不是他们的 .wsdl 文件并将其存储在本地。

    xml 文件的解决方法 通过添加到架构 targetnNamespace 参数来修复它。

    <definitions ... xmlns:myns="http://russianpost.org/operationhistory">
    <types>
        <xsd:schema targetNamespace="http://www.russianpost.org/custom-duty-info/data">
            <xsd:import namespace="http://www.russianpost.org/custom-duty-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=1"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data">
            <xsd:import namespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=2"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://schemas.xmlsoap.org/soap/envelope/">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=3"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/sms-info/data">
            <xsd:import namespace="http://russianpost.org/sms-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=4"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/operationhistory/data">
            <xsd:import namespace="http://russianpost.org/operationhistory/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=5"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/operationhistory">
            <xsd:import namespace="http://russianpost.org/operationhistory"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=6"/>
        </xsd:schema>
    </types>
    <message name="getOperationHistory" targetNamespace="http://russianpost.org/operationhistory">
        <part name="parameters" element="tns:getOperationHistory"/>
    </message>
    

    原始wsdl代码部分

        <types>
        <xsd:schema>
            <xsd:import namespace="http://www.russianpost.org/custom-duty-info/data" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=1"/>
        </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=2"/>
        </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=3"/>
        </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://russianpost.org/sms-info/data" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=4"/>
        </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://russianpost.org/operationhistory/data" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=5"/>
        </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://russianpost.org/operationhistory" schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=6"/>
        </xsd:schema>
    </types>
    <message name="getOperationHistory">
        <part name="parameters" element="tns:getOperationHistory"/>
    </message>
    

    现在使用我们的 wsdl 文件:

    var SoapClient = require('soap');
    var options = {
        'trace': 1,
        "overrideRootElement": {
            "namespace": "myns",
            "xmlnsAttributes": [{
                "name": "xmlns:ns2",
                "value": "http://russianpost.org/operationhistory"
            }]
        },
        forceSoap12Headers: true,
        connection: 'keep-alive',
        'soap_version': 2
    };
    SoapClient.createClient('./local_wsdl.xml', options, function (err, client) {
        client.getOperationHistory(
            {
            'ns1:OperationHistoryRequest': {
                'ns1:Barcode': trackValue,
                'ns1:MessageType': 0,
                'ns1:Language': 'RUS',
            },
            'ns1:AuthorizationHeader': {
                'ns1:login': login,
                'ns1:password': password,
            },
        },
        (err, result) => {
            if (err) {
                console.log(err);
    
                return;
            }
    
            console.log(result.OperationHistoryData);
        }
        );
    }
    

    【讨论】:

    • 仅适用于我将“targetNamespace=”添加到 wsdl 并将其的本地副本保存在应用程序的根路径中
    • 首先在我的浏览器中打开 wsdl url 并保存为 wsdl 文件,之后我在文本编辑器中进行了修改。
    • 嗨,当我无法访问服务器时,如何从另一台服务器更新soap服务器“wsdl文件”?
    • @SoheilTayyeb 如果您可以通过网络浏览器访问“wsdl 文件”,只需将文件保存在您的计算机上并更新即可。
    • 这很有效,+1,但请参阅下面我的答案以获得不需要保留 wsdl 的本地副本的解决方案。
    【解决方案2】:

    我通过只定义一个模式标签来解决,例如:

    发件人:

    <types>
        <xsd:schema targetNamespace="http://www.russianpost.org/custom-duty-info/data">
            <xsd:import namespace="http://www.russianpost.org/custom-duty-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=1"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data">
            <xsd:import namespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=2"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://schemas.xmlsoap.org/soap/envelope/">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=3"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/sms-info/data">
            <xsd:import namespace="http://russianpost.org/sms-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=4"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/operationhistory/data">
            <xsd:import namespace="http://russianpost.org/operationhistory/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=5"/>
        </xsd:schema>
        <xsd:schema targetNamespace="http://russianpost.org/operationhistory">
            <xsd:import namespace="http://russianpost.org/operationhistory"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=6"/>
        </xsd:schema>
    </types>
    

    收件人:

    <types>
        <xsd:schema targetNamespace="http://www.russianpost.org/custom-duty-info/data">
            <xsd:import namespace="http://www.russianpost.org/custom-duty-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=1"/>
            <xsd:import namespace="http://www.russianpost.org/RTM/DataExchangeESPP/Data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=2"/>
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=3"/>
            <xsd:import namespace="http://russianpost.org/sms-info/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=4"/>
            <xsd:import namespace="http://russianpost.org/operationhistory/data"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=5"/>
            <xsd:import namespace="http://russianpost.org/operationhistory"
                        schemaLocation="https://tracking.russianpost.ru/rtm34?xsd=6"/>
        </xsd:schema>
    </types>
    

    问候。

    【讨论】:

    【解决方案3】:

    虽然上述顶级解决方案确实有效,但它是一个糟糕的解决方案,因为它违背了 WSDL 的全部目的。 SoapUI 与我正在使用的服务配合得很好,这个工具应该也可以。

    我最终通过在第 826 行之后添加以下行来更新 node_modules\soap\lib\wsdl\elements.js 中的 node-soap 代码来解决这个问题:var targetNamespace = child.$targetNamespace;:

    if (!targetNamespace && child.includes && child.includes.length === 1) {
        targetNamespace = child.includes[0].namespace;
    }
    

    如果您有一个模式元素,其中唯一的子元素是导入元素(请参见下面的示例),则此方法有效。如果维护者愿意,可以尝试让 PR 获得批准。

    例子:

    <types>
      <xsd:schema>
        <xsd:import namespace="http://schema.core.datamodel.fs.documentum.emc.com/" schemaLocation="ObjectService_schema1.xsd"/>
      </xsd:schema>
      <xsd:schema>
        <xsd:import namespace="http://rt.fs.documentum.emc.com/" schemaLocation="ObjectService_schema2.xsd"/>
      </xsd:schema>
    </types>
    

    原始 TS 代码见 git repo:https://github.com/.../node-soap/.../elements.ts#L826

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,但还没有解决。

      版本: “肥皂”:“^0.19.0”

          Target-Namespace "undefined" already in use by another Schema!
      Target-Namespace "undefined" already in use by another Schema!
      /Users/andreas/scm/todoListApi/node_modules/soap/lib/wsdl.js:481
          this.element = schema.elements[nsName.name];
                               ^
      
      TypeError: Cannot read property 'elements' of undefinedTarget-Namespace "undefined" already in use by another Schema!
      

      更新:WSDL 不包含 targetNamespace。如何解决这个问题?我可以以某种方式使用 WSDL 选项吗?

      【讨论】:

      • 'schema'标签里面有一些子标签,属性'namespace'
      猜你喜欢
      • 1970-01-01
      • 2022-12-26
      • 2022-10-23
      • 2022-12-01
      • 2022-12-28
      • 2017-05-29
      • 2021-06-04
      • 2013-08-03
      • 1970-01-01
      相关资源
      最近更新 更多