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

Nodemon搭配TypeScript+Worker Threads运行报错如何解决?

问题根因

dev模式下你使用ts-node直接运行TypeScript源码,此时__filename指向的是.ts后缀的源文件,而Node.js原生的Worker线程默认仅支持.js/.mjs/.cjs后缀的脚本,无法直接识别TS文件,因此抛出扩展名校验错误。生产环境因为你提前把TS编译成了JS文件,__filename指向的是.js后缀的编译产物,所以可以正常运行。

解决方案

你只需要在初始化Worker时,针对开发环境添加execArgv参数,让Worker进程也通过ts-node加载TS文件即可,生产环境无需额外配置,不影响原有逻辑。

修改后的thread.ts代码

import {
    Worker, isMainThread, parentPort, workerData
} from "worker_threads";

let threadFunction:Function = ()=>{};
if (isMainThread) {
    threadFunction = function threadFunction() {
        return new Promise((resolve, reject) => {
            const worker = new Worker(__filename, {
                workerData: "abc",
                // 仅开发环境添加ts-node加载器
                ...(process.env.NODE_ENV === 'development' ? {
                    execArgv: ['-r', 'ts-node/register']
                } : {})
            });
            worker.on('message', resolve);
            worker.on('error', reject);
            worker.on('exit', (code) => {
                if (code !== 0)
                    reject(new Error(`Worker stopped with exit code ${code}`));
            });
        });
    };
} else {
    console.log("Received Data from Parent : ",workerData);
    // 补充:给主线程回发消息避免Promise一直挂起
    parentPort?.postMessage('worker executed success')
}

export default threadFunction;

额外注意事项

  • 如果你的项目有自定义的tsconfig路径,可以在execArgv里添加参数指定配置文件,比如execArgv: ['-r', 'ts-node/register', '--project', './tsconfig.json']
  • 若后续升级到Node.js 16+且使用ES模块模式,需要把execArgv调整为使用ts-node的ESM加载器:execArgv: ['--loader', 'ts-node/esm']

内容的提问来源于stack exchange,提问作者Rohit Rane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:27:04