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');
请问我哪里操作有误?
问题分析与解决方案
核心问题
- 请求生命周期提前结束:Next.js App Router的API路由是异步函数,当
return new Response('yada')执行后,当前请求的上下文会被立即销毁,Web Worker还没来得及完成消息回调就被终止。而纯Node环境没有请求生命周期限制,进程会等待Worker执行完成。 - 模块类型不匹配:你给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
相关产品推荐
相关产品推荐

