Node.js异步操作出现callback is not a function错误求助
排查 "callback is not a function" 错误的解决方法
我一眼就揪出了几个导致你报错的关键问题,咱们一步步拆解修复:
1. 重复定义函数导致覆盖
你写了两个同名的 getCommits 函数:
- 第一个是处理仓库数据的
function getCommits(repos) { ... } - 第二个是异步获取提交记录的
function getCommits(repo,callback) { ... }
在JavaScript里,函数声明会被提升,后面定义的函数会直接覆盖前面的。这就导致你调用第一个getCommits时,实际执行的是需要两个参数的异步版本,而你只传了一个参数,callback自然变成undefined,调用时就会抛出"callback is not a function"错误。
2. 错误的递归调用
你的 getRepositories 函数里,本该调用一个获取仓库列表的函数,结果写成了递归调用自己:getRepositories(user.gitHubUsername, getCommits)。这不仅逻辑完全错误,还会因为参数类型不匹配(user.gitHubUsername是字符串,而函数期望的是用户对象),进一步加剧回调传递的混乱。
3. 未定义的变量
在被覆盖的getCommits函数里,你用了repo变量,但函数参数明明是repos,这也是一个低级语法错误。
修正后的完整代码示例
我帮你补全了缺失的逻辑,调整了所有问题点:
console.log('Before'); getUser(1, getRepositories); console.log('After'); // 获取用户后触发,调用仓库接口 function getRepositories(user) { getRepos(user.gitHubUsername, getCommitsHandler); } // 获取仓库后触发,调用提交记录接口 function getCommitsHandler(repoList) { // 这里以第一个仓库为例,你也可以遍历所有仓库 getCommitsAsync(repoList[0], displayCommits); } // 最终展示提交记录 function displayCommits(commits) { console.log('获取到的提交记录:', commits); } // 异步获取提交记录(重命名避免冲突) function getCommitsAsync(repo, callback) { setTimeout(() => { console.log(`正在获取仓库 ${repo} 的提交记录...`); callback(['commit1', 'commit2', 'commit3']); }, 2000); } // 异步获取用户信息(补全你缺失的代码) function getUser(id, callback) { setTimeout(() => { console.log('正在获取用户信息...'); callback({ id: id, gitHubUsername: 'octocat' }); }, 1000); } // 新增:异步获取仓库列表的函数 function getRepos(username, callback) { setTimeout(() => { console.log(`正在获取用户 ${username} 的仓库列表...`); callback(['node-learning', 'demo-project', 'my-blog']); }, 1000); }
核心修复说明
- 重命名了冲突的函数:把异步获取提交的函数改成
getCommitsAsync,和处理仓库的函数彻底区分开 - 新增
getRepos函数专门负责获取仓库列表,解决了之前递归调用的问题 - 修正了变量名错误,确保所有参数和变量对应匹配
- 补全了
getUser的异步逻辑,模拟真实的用户数据返回
这样运行代码后,就能按顺序执行异步流程,再也不会出现回调相关的报错啦!
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

