You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:10:30