Nodejs 0.8.16 soap(web service) 错误

Nodejs 0.8.16 soap(web service) 错误

code:

var soap = require(‘soap’); var url = ‘http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl’; var endpoint = ‘http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx’;

var args = {qqCode:“123456”};

soap.createClient(url, function(err, client){ client.qqCheckOnline(args, function(err, result) { console.log(result.qqCheckOnlineResult); }); },endpoint);

环境: nodejs 0.8.16 soap-0.2.7

大家有遇到过吗?怎么解决?


9 回复

针对你提到的 Nodejs 0.8.16 soap(web service) 错误问题,我们可以从几个方面来分析和解决问题。首先,让我们回顾一下你提供的代码片段,并尝试找出可能存在的问题。

问题分析

  1. URL 和 Endpoint 的使用

    • 在你的代码中,url 是 WSDL 文件的地址,而 endpoint 是 Web Service 的地址。在创建客户端时,通常只需要提供 url 参数即可。endpoint 参数通常是不必要的,除非你在处理一些复杂的多端点的情况。
  2. 参数格式

    • 确保传递给 Web Service 的参数格式正确。在你的例子中,参数名 qqCode 需要与 WSDL 定义中的参数名称一致。
  3. 错误处理

    • 你的代码中已经有了一些基本的错误处理(通过回调函数),但为了更好地调试,建议添加更多的日志输出,以帮助理解具体出错的位置。

解决方案

基于上述分析,这里是一个改进后的代码示例:

var soap = require('soap');
var url = 'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl';

var args = {qqCode: "123456"};

// 创建客户端
soap.createClient(url, function(err, client) {
    if (err) {
        console.error("Error creating client:", err);
        return;
    }

    // 调用服务方法
    client.qqCheckOnline(args, function(err, result) {
        if (err) {
            console.error("Error calling qqCheckOnline:", err);
            return;
        }
        
        console.log("QQ Online Status:", result.qqCheckOnlineResult);
    });
});

关键点解释

  • 错误处理:增加了对 createClientqqCheckOnline 方法的错误处理,这样可以更清楚地知道在哪个步骤出现了问题。
  • 参数传递:确保参数 args 中的键值对符合 WSDL 文件中定义的服务接口要求。
  • 日志输出:通过增加日志输出,可以帮助快速定位问题所在。

如果你仍然遇到问题,建议检查 WSDL 文件的具体定义,确保所有参数都正确无误。此外,考虑到 Node.js 版本较旧(0.8.16),如果可能的话,尝试升级到更新的版本,因为新版本可能会修复一些已知的问题并提供更好的支持。


错误提示:

module.js:340 throw err; ^ Error: Cannot find module 'soap’ at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:362:17) at require (module.js:378:17) at Object.<anonymous> (F:\desktop\nodejs\untitled\app.js:8:12) at Module._compile (module.js:449:26) at Object.Module._extensions…js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10)

不填endpoint也是一样错误

sorry 上面的贴错 错误是:

F:\desktop\nodejs\untitled>app

assert.js:102 throw new assert.AssertionError({ ^ AssertionError: Invalid child type at DefinitionsElement.addChild (F:\desktop\nodejs\untitled\node_modules\soap \lib\wsdl.js:319:9) at Element.endElement (F:\desktop\nodejs\untitled\node_modules\soap\lib\wsdl .js:109:20) at WSDL._parse (F:\desktop\nodejs\untitled\node_modules\soap\lib\wsdl.js:917 :13) at EventEmitter.emit (events.js:96:17) at Parser.parse (F:\desktop\nodejs\untitled\node_modules\soap\node_modules\n ode-expat\lib\node-expat.js:18:22) at WSDL._parse (F:\desktop\nodejs\untitled\node_modules\soap\lib\wsdl.js:920 :12) at WSDL._fromXML (F:\desktop\nodejs\untitled\node_modules\soap\lib\wsdl.js:9 28:29) at WSDL (F:\desktop\nodejs\untitled\node_modules\soap\lib\wsdl.js:584:18) at process.startup.processNextTick.process._tickCallback (node.js:244:9)

F:\desktop\nodejs\untitled>

根据https://github.com/milewise/node-soap/issues/57提出的解决方案 的确解决了错误问题,可是也提示:未将对象引用设置到对象的实例

我对js不熟悉 不知道var args = {qqCode:“123456”};这个写不对马?

php测试代码:$result = $soap->qqCheckOnline(array(‘qqCode’ => ‘1312323’)); 测试通过

另外我也看到你的另外一个文章 似乎也是在说这个问题的?

抓包发现: php: <?xml version=“1.0” encoding=“UTF-8”?> -<SOAP-ENV:Envelope xmlns:ns1=“http://WebXml.com.cn/” xmlns:SOAP-ENV=“http://schemas.xmlsoap.org/soap/envelope/”>-SOAP-ENV:Body-ns1:qqCheckOnlinens1:qqCode1312323</ns1:qqCode></ns1:qqCheckOnline></SOAP-ENV:Body></SOAP-ENV:Envelope>

nodejs: <?xml version=“1.0”?> -<soap:Envelope xmlns:tns=“http://WebXml.com.cn/” xmlns:tm=“http://microsoft.com/wsdl/mime/textMatching/” xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/”>soap:Header/-soap:Body-tns:qqCheckOnline<qqCode>123456</qqCode></tns:qqCheckOnline></soap:Body></soap:Envelope>

谢谢了!问题解决了,看来维护者还有很多工作要做,这个东西还是不能直接用在产品当中的

根据你提供的代码片段和描述,你遇到了在使用 soap 模块时的一个错误。从你的描述来看,问题可能与 Node.js 版本(0.8.16)以及 soap 模块版本(0.2.7)有关。这两个版本都比较旧了,这可能导致一些不兼容或者已知的问题。

解决方案

1. 升级 Node.js 和 soap 模块

建议首先升级 Node.js 到最新稳定版,并且更新 soap 模块到最新版本。你可以通过以下命令来更新:

npm install -g npm
npm install node@latest

对于 soap 模块,你可以在项目中运行:

npm install soap@latest

2. 修改代码

如果升级之后问题依旧存在,可以尝试修改你的代码以适应新的 soap 模块版本。以下是修改后的代码示例:

const soap = require('soap');
const url = 'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl';

const args = {qqCode: "123456"};

soap.createClient(url, (err, client) => {
    if (err) {
        console.error("创建客户端失败", err);
        return;
    }
    client.qqCheckOnline(args, (err, result) => {
        if (err) {
            console.error("请求失败", err);
            return;
        }
        console.log(result.qqCheckOnlineResult);
    });
});

注意事项

  • 确保网络连接正常,可以访问指定的 WSDL 地址。
  • 确保传入的参数格式正确,尤其是字符串类型的参数,需要确保引号类型一致(例如全角引号 “” 和半角引号 “” 的区别)。
  • 查看 soap 模块文档,了解最新的 API 使用方式。

通过以上步骤,你应该能够解决你遇到的问题。如果问题仍然存在,建议检查是否有其他依赖项或配置问题。

回到顶部