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
大家有遇到过吗?怎么解决?
针对你提到的 Nodejs 0.8.16 soap(web service)
错误问题,我们可以从几个方面来分析和解决问题。首先,让我们回顾一下你提供的代码片段,并尝试找出可能存在的问题。
问题分析
-
URL 和 Endpoint 的使用:
- 在你的代码中,
url
是 WSDL 文件的地址,而endpoint
是 Web Service 的地址。在创建客户端时,通常只需要提供url
参数即可。endpoint
参数通常是不必要的,除非你在处理一些复杂的多端点的情况。
- 在你的代码中,
-
参数格式:
- 确保传递给 Web Service 的参数格式正确。在你的例子中,参数名
qqCode
需要与 WSDL 定义中的参数名称一致。
- 确保传递给 Web Service 的参数格式正确。在你的例子中,参数名
-
错误处理:
- 你的代码中已经有了一些基本的错误处理(通过回调函数),但为了更好地调试,建议添加更多的日志输出,以帮助理解具体出错的位置。
解决方案
基于上述分析,这里是一个改进后的代码示例:
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);
});
});
关键点解释
- 错误处理:增加了对
createClient
和qqCheckOnline
方法的错误处理,这样可以更清楚地知道在哪个步骤出现了问题。 - 参数传递:确保参数
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 使用方式。
通过以上步骤,你应该能够解决你遇到的问题。如果问题仍然存在,建议检查是否有其他依赖项或配置问题。