调试 JavaScript 和 TypeScript
server.ts
--inspect
要在使用 Bun 运行代码时启用调试,请使用 --inspect 标志。此标志会在可用端口上启动一个 WebSocket 服务器,用于检查正在运行的 Bun 进程。
terminal
--inspect-brk
--inspect-brk 标志的行为与 --inspect 完全相同,不同之处在于,它会在执行脚本的第一行注入一个断点。对于运行速度很快并会立即退出的脚本,可以使用此标志进行调试。
--inspect-wait
--inspect-wait 标志的行为与 --inspect 完全相同,不同之处在于,直到调试器连接到正在运行的进程后,代码才会执行。
为调试器设置端口或 URL
无论使用哪个标志,都可以指定端口号、URL 前缀,或同时指定两者。terminal
调试器
Several debugging tools can connect to this server.debug.bun.sh
Bun 在 debug.bun.sh 上提供了一个基于 Web 的调试器。它是 WebKit 的 Web Inspector Interface 的修改版本,Safari 用户会对它感到熟悉。
在浏览器中打开提供的 debug.bun.sh URL,即可开始调试会话。在此界面中,你可以查看正在运行的文件的源代码、查看和设置断点,并使用内置控制台执行代码。
3,在 console.log(req.url) 语句上设置断点。
http://localhost:3000。页面会一直加载,因为程序已在断点处暂停。
注意界面发生的变化。
req,即可查看其属性和方法。
- 继续执行脚本 — 运行至下一个断点或异常处。
- 单步跳过 — 执行至下一行。
- 单步进入 — 如果当前语句包含函数调用,则进入被调用的函数。
- 单步跳出 — 如果当前语句是函数调用,则执行完该调用,然后返回调用它的位置。

Visual Studio Code 调试器
Visual Studio Code 对 Bun 脚本的调试支持仍处于实验阶段。要使用此功能,请安装 Bun VSCode 扩展。调试网络请求
设置BUN_CONFIG_VERBOSE_FETCH 环境变量,以记录通过 fetch() 或 node:http 发出的网络请求。
以 curl 命令打印 fetch 和 node:http 请求
将BUN_CONFIG_VERBOSE_FETCH 设置为 curl,即可将每个 fetch() 和 node:http 请求打印为单行 curl 命令。你可以将其复制并粘贴到终端中,以复现该请求。
index.ts
[fetch] > 标记的行是本地代码发出的请求,以 [fetch] < 标记的行是远程服务器的响应。
若要在不打印 curl 命令的情况下输出日志,请将 BUN_CONFIG_VERBOSE_FETCH 设置为 true。
index.ts
堆栈跟踪和 sourcemaps
Bun 会转译每个文件,这可能导致堆栈跟踪指向转译后的输出。为避免这种情况,Bun 会为它转译的每个文件生成并提供带 sourcemap 的文件。当你在控制台中看到堆栈跟踪时,可以点击文件路径并跳转到原始源代码,即使该代码是用 TypeScript 或 JSX 编写的,或者经过了其他转换。 Bun 会在运行时按需转译文件时加载 sourcemap,也会在使用bun build 预先编译文件时加载 sourcemap。
带语法高亮的源代码预览
Bun 会在发生未处理的异常或拒绝时打印一小段源代码预览。要自行生成相同的输出,请调用Bun.inspect(error):
V8 堆栈跟踪
Bun 使用 JavaScriptCore 作为其引擎,但 Node.js 生态系统中的许多工具以及 npm 都期望使用 V8,而不同的 JavaScript 引擎对error.stack 的格式化方式各不相同。由于 Bun 旨在成为 Node.js 的直接替代品,因此它会按照 V8 的方式格式化 error.stack。当你使用期望 V8 堆栈跟踪的库时,这一点尤为重要。
V8 堆栈跟踪 API
Bun 实现了 V8 堆栈跟踪 API,这是一组用于操作堆栈跟踪的函数。Error.prepareStackTrace
定义一个全局的 Error.prepareStackTrace 函数,以自定义堆栈跟踪输出。它接收错误对象和一个 CallSite 对象数组,其返回值会成为 error.stack。
CallSite 对象的可用方法如下:
如果
Function 对象已经被垃圾回收,其中一些方法会返回 undefined。
Error.captureStackTrace(error, startFn)
Error.captureStackTrace 会在代码中的特定位置捕获堆栈跟踪,而不是在抛出错误的位置捕获。
当回调或异步代码使错误来源难以确定时,这会很有帮助。Error.captureStackTrace 的第 2 个参数是你希望堆栈跟踪从其开始的函数。
在以下示例中,err.stack 指向调用 fn() 的代码,尽管错误是在 myInner 中抛出的。
index.ts