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

Next.js App Router中使用Web Worker无输出问题求助

问题:Next.js App Router中Web Worker无法正常输出日志

我尝试在Next.js的App Router中使用Web Worker,但未得到预期结果。具体代码如下:

import Worker from 'web-worker';

export async function GET(request: Request) {
  const worker = new Worker(`data:application/javascript,postMessage(42)`, {type:'module'});
  worker.addEventListener('message', e => {
      console.log("HAAAAAALLLLLOOOOOO! " + e.data)  // "200 OK"
  });
  worker.postMessage('hello');    

  return new Response('yada');
}

预期输出为HAAAAAALLLLLOOOOOO! 42,但发起GET请求时无任何打印。

在纯Node环境中运行如下类似代码却能正常工作:

var Worker = require("web-worker")

const worker = new Worker(`data:application/javascript,postMessage(42)`);
worker.addEventListener('message', e => {
    console.log("HAAAAAALLLLLOOOOOO! " + e.data)
});
worker.postMessage('hello');

请问我哪里操作有误?


问题分析与解决方案

核心问题

  1. 请求生命周期提前结束:Next.js App Router的API路由是异步函数,当return new Response('yada')执行后,当前请求的上下文会被立即销毁,Web Worker还没来得及完成消息回调就被终止。而纯Node环境没有请求生命周期限制,进程会等待Worker执行完成。
  2. 模块类型不匹配:你给Worker添加了{type:'module'}选项,但数据URL中的代码是普通自执行脚本,并非ES模块,这会导致Worker初始化失败,无法触发消息监听。

修复代码

import Worker from 'web-worker';

export async function GET(request: Request) {
  return new Promise((resolve) => {
    // 移除type:'module'选项
    const worker = new Worker(`data:application/javascript,postMessage(42)`);
    
    worker.addEventListener('message', e => {
      console.log("HAAAAAALLLLLOOOOOO! " + e.data);
      // 收到Worker消息后再返回响应,确保回调执行完毕
      resolve(new Response('yada'));
    });
    
    worker.postMessage('hello');
  });
}

额外说明

如果后续需要在Worker中使用ES模块语法,需将代码改为符合模块规范的写法(比如使用export或模块导入),同时保留type:'module'选项,但这种场景不适合用数据URL,建议单独创建Worker文件并通过路径引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:55:02