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

在Firebase Functions中使用worker_threads如何指定本地文件路径?

问题

使用worker_threads在Firebase v2函数中卸载CPU密集型任务时,初始化Worker传入本地路径报错:

An error occurred: Error: Cannot find module '/workspace/worker.js'

worker文件与调用new Worker()的函数位于src根目录同一文件夹,尝试path.resolve无效,无法找到正确指定Worker文件路径的方法。

文件结构

lib
   - firebase_function.js
   - worker.js
   - index.js
src
   - firebase_function.ts
   - worker.ts
   - index.ts

复现步骤

  1. 创建Firebase v2可调用函数:
import {onCall} from "firebase-functions/v2/https";
import {Worker} from "worker_threads";

const oncallablefunction = onCall(async (request) => {
    const result = await new Promise((resolve, reject) => {
        const worker = new Worker("./worker.js"); // <- 此处报错找不到文件
        worker.on('message', resolve);
        worker.on('error', reject);
    });

    console.log(result); // 预期输出1000
})

export {oncallablefunction}
  1. 同目录创建worker.ts(编译后为worker.js):
import {parentPort} from "worker_threads";

function doWork() {
    return 1000 // CPU密集型计算任务示例
}

const result = doWork()

if (parentPort) {
    parentPort.postMessage(result);
}
  1. index.ts导出函数:
import admin from "firebase-admin";

admin.initializeApp();

export * from './firebase_function.js';
  1. 部署后执行函数,触发错误:

Unhandled error Error: Cannot find module '/workspace/worker.js' at Function.Module._resolveFilename


解决方案

Firebase函数部署后,代码会被打包到特定运行目录,直接使用相对路径会因工作目录不匹配导致文件查找失败,可按以下方式解决:

  1. 用ES模块兼容方式获取绝对路径
    ES模块中没有__dirname,需通过fileURLToPath和dirname手动获取当前文件的目录路径,再拼接worker文件的绝对路径:
import {onCall} from "firebase-functions/v2/https";
import {Worker} from "worker_threads";
import {fileURLToPath} from 'url';
import {dirname, resolve} from 'path';

// 替代CommonJS中的__dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const oncallablefunction = onCall(async (request) => {
    const result = await new Promise((resolve, reject) => {
        // 生成worker文件的绝对路径
        const workerPath = resolve(__dirname, './worker.js');
        const worker = new Worker(workerPath);
        worker.on('message', resolve);
        worker.on('error', reject);
    });

    console.log(result);
})

export {oncallablefunction}
  1. 确保worker文件被包含在部署包中
    检查.firebaseignore文件,确认没有排除lib/worker.js;Firebase默认会打包lib目录文件,若有自定义部署配置,需保证worker编译文件被纳入部署范围。

  2. 验证部署后的实际路径
    可在函数中添加日志打印当前目录和worker路径,确认文件实际位置后调整拼接逻辑:

console.log('当前文件目录:', __dirname);
console.log('worker绝对路径:', resolve(__dirname, './worker.js'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:42:40