Node.js中使用Tesseract时出现ERR_INVALID_CALLBACK错误
问题描述
我在Node.js中使用Tesseract处理图片时遇到如下错误:
fs.js:132
throw new ERR_INVALID_CALLBACK(); ^
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
at makeCallback (fs.js:132:11)
at Object.fs.unlink (fs.js:1002:14)
at /home/bakedpanda/Documents/BTP/node_modules/node-tesseract/lib/tesseract.js:99:14
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:408:3)
我的代码如下:
var tesseract = require('node-tesseract'); tesseract.process('cap.jpg',function (err, text){ if(err) { console.error(err); } else { console.log(text); } });
//cap.jpg与代码文件在同一目录下。
请问该如何解决这个回调函数无效的问题?
解决方案
这个问题我之前也碰到过,本质是旧版node-tesseract库的代码和Node.js新版本的fs API不兼容导致的:新版本Node.js要求fs.unlink必须传入回调函数,但旧库在清理临时文件的逻辑里(也就是报错信息里的tesseract.js:99行),某些分支下没传回调,直接触发了这个错误。
这里有两种可行的解决办法:
方法一:改用维护活跃的替代库(推荐)
原node-tesseract已经很久没更新了,建议换成更活跃的分支node-tesseract-ocr,它修复了这类API兼容问题,还支持Promise风格调用,用起来更顺手:
- 先卸载旧库:
npm uninstall node-tesseract - 安装新库:
npm install node-tesseract-ocr - 修改代码适配新库API:
const tesseract = require('node-tesseract-ocr'); // 可根据需求配置语言、识别模式等参数 const config = { lang: 'eng', oem: 1, psm: 3, }; tesseract.recognize('cap.jpg', config) .then(text => { console.log('识别结果:', text); }) .catch(err => { console.error('识别出错:', err); });
方法二:手动修复旧库代码(临时应急)
如果一定要继续用旧版node-tesseract,可以临时修改库文件:
- 找到报错路径下的
tesseract.js:/home/bakedpanda/Documents/BTP/node_modules/node-tesseract/lib/tesseract.js - 定位到第99行的
fs.unlink调用,补全回调函数,比如改成:fs.unlink(tmpFile, function(err) { if (err) console.warn('清理临时文件失败:', err); });
注意:这种方法的缺点是,重新安装依赖或更新库时,修改会被覆盖,只适合临时救急。
内容的提问来源于stack exchange,提问作者bakedpanda

