Node.js中Tesseract.js重复调用报错问题求助
Tesseract.js重复执行报错问题排查与解决
问题原因
第一次执行foo()时,你调用了await worker.terminate(),这个方法会彻底销毁当前Tesseract Worker实例并释放资源。当setTimeout触发第二次foo()执行时,你试图再次调用await worker.load(),但此时worker已经是被销毁的空对象(内部状态为null),因此抛出Cannot read property 'send' of null错误。
另外,原代码中的自执行异步函数没有错误捕获逻辑,导致Promise拒绝时出现未处理的警告。
解决方案
方案1:每次执行创建新Worker实例
将Worker的创建逻辑放到foo()内部,每次执行都新建一个Worker,用完后销毁:
const { createWorker } = require('tesseract.js'); function foo() { (async () => { const worker = createWorker(); await worker.load(); await worker.loadLanguage('eng'); await worker.initialize('eng'); await worker.setParameters({ tessedit_char_whitelist: '123456789' }); const { data: { text } } = await worker.recognize('Download.png'); console.log(text); await worker.terminate(); })().catch(err => { console.error('识别失败:', err); }); setTimeout(foo, 10000); } foo();
方案2:复用同一个Worker实例(性能更优)
只初始化一次Worker,后续重复使用该实例,避免频繁创建销毁的开销:
const { createWorker } = require('tesseract.js'); // 初始化Worker(仅执行一次) async function initWorker() { const worker = createWorker(); await worker.load(); await worker.loadLanguage('eng'); await worker.initialize('eng'); await worker.setParameters({ tessedit_char_whitelist: '123456789' }); return worker; } // 复用Worker执行识别逻辑 async function runRecognition(worker) { try { const { data: { text } } = await worker.recognize('Download.png'); console.log(text); } catch (err) { console.error('识别失败:', err); } } // 启动循环执行 (async () => { const worker = await initWorker(); const foo = () => { runRecognition(worker).finally(() => { setTimeout(foo, 10000); }); }; foo(); })();
内容的提问来源于stack exchange,提问作者Genesis1337
相关产品推荐
相关产品推荐

