Node.js中使用node-soap客户端调用SOAP方法时出现TypeError: callback is not a function错误的解决方法
解决node-soap 0.35.0中使用async/await时的
TypeError: callback is not a function错误 我之前也踩过这个坑,node-soap 0.35.0版本的客户端方法是基于回调模式设计的,并不原生支持Promise/async-await语法。当你直接用await调用mySoapClient.Perform_Operation({ ... })时,它会默认把你传入的参数(这里只有配置对象)当作回调函数去执行,自然就会抛出“callback is not a function”的错误。
下面是几种可行的解决办法:
1. 用util.promisify包装回调方法
Node.js内置的util.promisify可以快速把回调风格的函数转成Promise风格,适合大多数常规场景:
import { promisify } from 'util'; // 把目标SOAP方法转为Promise风格 const performOperation = promisify(mySoapClient.Perform_Operation); // 然后用async/await调用 const result = await performOperation({ /* 你的请求参数 */ });
如果你的SOAP方法回调有多个返回值(比如(err, result, rawResponse, soapHeader)这种格式),promisify只会返回第二个参数(result)。要是需要获取其他返回值,就得手动封装Promise:
const performOperation = async (params: YourParamsType) => { return new Promise((resolve, reject) => { mySoapClient.Perform_Operation(params, (err, result, rawResponse, soapHeader) => { if (err) return reject(err); // 按需求返回多个值,比如用对象或数组封装 resolve({ result, rawResponse, soapHeader }); }); }); }; // 调用示例 const { result, rawResponse } = await performOperation({ /* 请求参数 */ });
2. 升级node-soap版本(可选)
如果项目允许兼容版本变更,node-soap在0.40+版本已经原生支持Promise风格调用,直接用await就不会出现这个问题。不过升级前要注意检查新版本的API变化,避免引发其他兼容性问题。
额外注意事项
- 确保
mySoapClient已经完成初始化(比如通过soap.createClientAsync或者回调方式初始化完成),不要在客户端未就绪时调用方法。 - 核对SOAP方法名的大小写,SOAP服务端通常对方法名大小写敏感,拼写错误也可能导致异常。
内容的提问来源于stack exchange,提问作者Nick Grealy
相关产品推荐
相关产品推荐

