调用Node.js Swagger API端点函数时出现callback is not a function报错
问题根源
你的getCauById函数定义要求传入2个入参:
- 第一个参数为查询用的ID值
- 第二个参数为回调函数,用于接收数据库查询的结果或错误
你手动调用时只传入了ID,没有传入第二个回调函数,代码执行到callback(err)/callback(result)逻辑时找不到对应函数,就抛出了TypeError。
另外你当前的函数写法存在冗余:给CauModel.findById传入回调参数时,mongoose不会返回Promise,所以函数头部的async和方法前的await完全没有实际作用。
Swagger调用时没有问题的原因是:框架的路由绑定逻辑会自动为每个端点处理函数注入预设的回调方法,这个回调会自动把返回结果封装成HTTP响应返回给前端,不需要你手动传入。
修复方案
方案1:直接按原函数要求传入回调
原函数的回调逻辑没有遵循Node.js常规的错误优先回调约定,不管是错误还是正常结果都会直接传入回调的第一个参数,调用时需要自行判断类型:
const caus = require("../cau") caus.getCauById("608ff7531ee4d422a201ff5a", (data) => { if (data instanceof Error) { // 处理错误逻辑 console.error('查询失败:', data) return } // 处理正常查询结果 console.log('查询结果:', data) })
方案2:优化函数适配async/await调用(推荐)
如果后续需要频繁在代码内部调用该方法,建议改造为返回Promise的形式,语法更简洁易维护:
// 改造后的处理函数 var getCauById = async function (id) { // 不传回调时mongoose方法直接返回Promise,可直接await return CauModel.findById(id) }
改造后调用方式:
const caus = require("../cau") async function yourBusiness() { try { const result = await caus.getCauById("608ff7531ee4d422a201ff5a") console.log('查询结果:', result) } catch (err) { console.error('查询失败:', err) } }
如果不想影响现有Swagger端点的对外逻辑,可以保留原有兼容回调的函数版本,单独新增一个供内部调用的异步版本即可。
内容的提问来源于stack exchange,提问作者juanmac
相关产品推荐
相关产品推荐

