使用Deno Watcher重启时遭遇AddrInUse错误求助
解决Deno Watch重启时端口占用(AddrInUse: os error 10048)的问题
问题场景
Windows 11系统下,使用Deno 1.28.0执行deno run --allow-all --watch app.ts启动Express项目,修改保存app.ts后,Deno Watcher触发重启时抛出AddrInUse错误,提示端口8000被占用;再次保存文件,错误仍会重复出现。
原因分析
Deno的Watcher在重启进程时,旧的Express服务器进程未被彻底终止(受Deno Node.js兼容层特性影响),导致8000端口始终被旧进程占用,新进程无法绑定该端口。
解决方案
方案1:添加优雅关闭逻辑(推荐)
修改app.ts,保存Express服务器实例,并监听Deno的终止信号,在进程退出前主动关闭服务器,确保端口被释放:
import express, { Express, Request, Response } from "npm:express@4.18"; import { v4 as uuidv4 } from 'npm:uuid@9.0.0'; const app: Express = express(); app.use("/", (_req: Request, res: Response) => { res.send(`uuid: ${uuidv4()}.`); }) // 保存server实例 const server = app.listen(8000, () => { console.log("App Running: http://localhost:8000"); }); // 监听终止信号,优雅关闭服务器 ['SIGINT', 'SIGTERM'].forEach(signal => { Deno.addSignalListener(signal, () => { console.log(`收到${signal}信号,正在关闭服务器...`); server.close(() => { console.log('服务器已关闭'); Deno.exit(0); }); }); });
方案2:使用Deno不稳定特性强制终止旧进程
启动命令添加--unstable-kill-on-close参数(Deno 1.20及以上版本支持),该参数会在Watcher重启时强制杀死旧进程,自动释放端口:
deno run --allow-all --watch --unstable-kill-on-close app.ts
方案3:手动释放端口(临时解决)
如果需要快速临时解决,可手动杀死占用8000端口的进程:
- 查找占用端口的进程ID(PID):
netstat -ano | findstr :8000
- 杀死对应进程(将
<PID>替换为上一步获取的进程ID):
taskkill /F /PID <PID>
内容的提问来源于stack exchange,提问作者ShCc
相关产品推荐
相关产品推荐

