NodeJS报错‘cb is not a function’的排查与解决求助
看你描述的情况,直接调用cb('hehe', 'hoho')都报错,这说明回调函数根本没被正确传递到examine方法里,大概率是模块导出或者调用logic.examine的方式出了问题,我们一步步排查:
1. 检查logic.js的模块导出方式
你有没有正确把examine方法导出?如果没导出,app模块里的logic.examine可能不是你定义的那个函数,甚至可能是undefined,导致传递的参数顺序完全混乱。
比如你的logic.js结尾应该有类似这样的导出代码:
// CommonJS规范(Node.js默认) module.exports = { examine: examine, getOpenAssignments: getOpenAssignments // 别忘了把用到的getOpenAssignments也导出 }; // 如果用了ES6模块(package.json里设置了type: module) export { examine, getOpenAssignments };
要是没正确导出,app.js里引入的logic对象可能没有examine方法,或者是其他默认导出的内容,调用时自然会出现参数错位,cb拿到的根本不是回调函数。
2. 确认app.js中logic的引入路径正确
检查你在app.js里引入logic的代码:
const logic = require('./logic'); // 确保路径正确,比如logic.js和app.js在同一目录下
如果路径写错了(比如写成require('./logic/index')但实际文件是logic.js),可能会引入一个不存在的模块,或者默认导出的空对象,导致logic.examine不是你定义的函数,参数传递自然出错。
3. 用调试日志确认参数类型
在app.js调用logic.examine之前,先打印一下相关变量的类型,确认它们都是函数:
app.get('/assignments/open/:student', function (request, response) { var callback = function(mail, jobtitle) { response.status(200).json(logic.getOpenAssignments(request.params.student)); }; // 新增调试代码,看控制台输出 console.log('typeof logic.examine:', typeof logic.examine); console.log('typeof callback:', typeof callback); logic.examine(request, callback); });
如果logic.examine不是function,那肯定是导出/引入的问题;如果callback是function但调用时还是报错,那可能是examine方法被其他地方修改了(比如被绑定了上下文,导致参数顺序变化)。
4. 额外优化:修复HTTP请求的流式数据处理
另外,你的HTTP请求处理有个小问题:res.on('data')可能会多次触发(如果响应是分段传输的),直接解析单块chunk会导致解析失败,应该先把所有chunk拼接起来再解析:
examine: function (request, cb) { var options = { host: 'graph.microsoft.com', path: '/v1.0/me', method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': request.get('Authorization') } }; var req = http.get(options, function(res) { let data = ''; res.on('data', function(chunk) { data += chunk; // 先拼接所有数据块 }); res.on('end', function() { // 在end事件里解析完整数据 try { const chunk = JSON.parse(data); const mail = chunk['mail']; const jobtitle = chunk["jobTitle"]; cb(mail, jobtitle); } catch (err) { console.error('解析响应失败:', err); cb(null, null, err); // 把错误传递给回调,方便上层处理 } }); res.on('error', function(err) { console.error('响应错误:', err); cb(null, null, err); }); }); req.on('error', function(err) { console.error('请求错误:', err); cb(null, null, err); }); },
不过这个不是导致cb is not a function的原因,但修复后能避免其他潜在问题。
总结
最可能的原因是模块导出/引入错误,导致logic.examine不是你定义的函数,或者调用时参数传递错位。先检查导出和引入代码,再用调试日志确认参数类型,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者abstract christmas tree

