前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket

# 开发debug

30 秒速记

  • node --inspect index.js 打开调试端口,默认 127.0.0.1:9229
  • Chrome 打开 chrome://inspect,或点 DevTools 里的绿色 Node 图标连接
  • 想停在第一行用 --inspect-brk,启动阶段的代码才来得及打断点
  • VS Code 用 launch.json 或「JavaScript Debug Terminal」调试更顺手
  • 别把 --inspect=0.0.0.0 暴露到公网,连上调试端口等于能执行任意代码

调试 Node 最直接的办法是用 --inspect 启动,让进程开一个调试端口,再用 Chrome DevTools 连上去,像调前端页面一样打断点、看变量。 默认监听 127.0.0.1:9229,打开 chrome://inspect 就能看到目标进程。代码在启动时就执行完的话来不及打断点,这时用 --inspect-brk,进程会停在第一行等你。日常开发我更多在 VS Code 里调,原理一样,都是走 Inspector 协议。要注意调试端口绝不能开到公网,它能直接执行任意代码。

理解「开发debug」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 testing 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Node 调试的底层是 V8 Inspector 协议:--inspect 让进程起一个 WebSocket 服务,调试器(Chrome DevTools、VS Code)连上去后通过它下发断点、单步、读取变量这些指令。常用的几种启动方式:

node --inspect index.js            # 开调试端口,代码照常运行
node --inspect-brk index.js        # 开调试端口,并停在第一行
node --inspect=9230 index.js       # 换端口,多个服务同时调试时用
nodemon --inspect index.js         # 改代码自动重启,配合专用 DevTools 窗口自动重连
@前端进阶之旅: 代码已经复制到剪贴板

VS Code 里最省事的是打开「JavaScript Debug Terminal」,在这个终端里跑 npm run dev,会自动挂上调试器,不用写配置。环境要求方面,--inspect 从 Node 6.3 开始提供,Node 8 起移除了旧的 --debug,现在所有在维护的 Node 版本都可以直接用。安全上要记住:调试端口能执行任意代码,默认绑 127.0.0.1 就是为了不让外部访问,改成 0.0.0.0 只能出现在本地容器开发里。

面试官追问

追问 1启动阶段的初始化代码打不上断点,一运行就过去了,怎么办?
参考回答

换成 node --inspect-brk index.js,进程会停在第一行等调试器连上,这时再打断点然后继续执行。

追问 2服务跑在 Docker 里,本机 Chrome 连不上调试端口,为什么?
参考回答

--inspect 默认只监听容器内的 127.0.0.1,要改成 --inspect=0.0.0.0:9229 并映射端口 -p 9229:9229。只在本地开发这么做,线上环境不要开。

追问 3用 nodemon 自动重启,每次重启都要重新连调试器,烦不烦?
参考回答

nodemon --inspect index.js 就行,chrome://inspect 里点「Open dedicated DevTools for Node」打开的专用窗口会在进程重启后自动重连。

追问 4线上进程 CPU 飙高,能直接 --inspect 上去打断点吗?
参考回答

不建议,断点会让整个进程停住,所有请求都卡死。线上一般是抓 CPU profile 或堆快照带回本地分析,比如用 node --cpu-prof 或者给进程发 SIGUSR1 临时开启 Inspector,抓完立刻关。

# 开发debug

# 快速开始

30 秒速记

  • 三步:node --inspect index.js 启动 → 终端打印 Debugger listening on ws://... → Chrome 里连上
  • 连接入口:DevTools 左上角绿色 Node 图标,或者 chrome://inspect 的 Remote Target
  • 打开专用调试窗口后,在 Sources 面板找到文件打断点,再发请求触发
  • 环境:Node 8+、Chrome 60+ 就能用,现在的版本都满足
  • 终端里的 ws:// 地址带随机 UUID,每次启动都会变,手动连要重新复制

快速上手就三步:用 --inspect 启动服务,在 Chrome 里找到这个 Node 进程打开专用 DevTools,然后在 Sources 面板打断点、发请求触发。 启动后终端会打印一行 Debugger listening on ws://127.0.0.1:9229/...,说明调试端口开好了。打开任意页面的 DevTools,左上角会多出一个绿色的 Node 图标,点它就能进入调试窗口;也可以访问 chrome://inspect 找目标。断点打在路由处理函数里,再用浏览器或 curl 请求一下接口,代码就会停下来,可以看 ctx 里的内容。

理解「快速开始」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1DevTools 里没看到绿色的 Node 图标,怎么排查?
参考回答

先看终端有没有打印 Debugger listening,没有就是启动参数没带上。打印了的话打开 chrome://inspect,检查 Configure 里有没有 localhost:9229,端口改过的话要把新端口加进去。

追问 2断点打上了,请求过来却没停,可能是什么原因?
参考回答

常见是断点打在了 TypeScript 源码或打包产物上但没开 sourcemap,或者请求压根没走到这个分支。可以先在函数第一行写个 debugger;,确认调试器确实生效。

追问 3同时启动两个服务都带 --inspect,第二个报端口占用,怎么办?
参考回答

默认都抢 9229。给第二个指定端口 --inspect=9230,或者写 --inspect=0 让系统随机分配,终端会打印实际端口。

追问 4断点停在路由里时,怎么查看当前请求的参数?
参考回答

右侧 Scope 面板直接展开 ctx,看 ctx.query、ctx.request.body;也可以在 Console 里输入 ctx.headers 实时求值,作用域就是当前断点所在的函数。

追问 5调试时日志太多,分不清哪条属于哪个请求,怎么办?
参考回答

给每个请求注入一个 requestId,用 AsyncLocalStorage 在整条异步链里传递,所有日志都带上它。按 requestId 一过滤,单个请求的完整轨迹就出来了。

# 环境

30 秒速记

  • 调试 Koa 服务的最低配置:Node.js 8.x+(--inspect 已稳定、原生支持 async/await)+ Chrome 60+(DevTools 里有 Node 入口)
  • Koa 2 本身要求 Node 7.6+,因为中间件全是 async 函数
  • 用到 AsyncLocalStorage 的示例要 Node 12.17+ / 13.10+,16.4 才算稳定,现在直接上 Node 18+ 省心
  • 示例代码写的是 import,要么文件叫 .mjs,要么 package.json 里加 "type": "module"
  • Chrome 只是调试前端界面,代码真正跑在 Node 进程里,版本以服务端 node -v 为准

这一节要的就两样东西:Node.js 8.x 以上,Chrome 60 以上。 Node 8 开始 --inspect 调试协议是正式的,Chrome 能直接连上去打断点;Chrome 60 之后 DevTools 左上角会出现一个绿色的 Node 图标,点一下就能打开专门调 Node 的窗口。要注意的是这只是调试本身的门槛,后面用到 AsyncLocalStorage 的例子至少要 Node 12.17,所以我一般建议直接装个 Node 18 或 20 的 LTS 版本,再用 nvm 按项目切版本。

  • node环境 8.x +
  • chrome 60+

理解「环境」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

调试环境可以拆成两半来理解:被调试的一方是 Node 进程,负责真正执行代码;调试界面的一方是 Chrome DevTools 或 VS Code,负责显示源码、断点和变量。两者之间走的是 Inspector

基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础篇

    • 环境搭建
    • node部署
    • 基础应用
  • 内置模块

    • 1.0 本地路径处理 path
    • 2.0 文件系统操作 fs
    • 3.1 基础调试 console
    • 3.2 本地调试远程服务器上的Node代码
    • 4.1 网络服务 http
    • 4.2 网络服务 http res
    • 4.3 网络服务 http req
    • 4.4 网络服务 http server
    • 4.5 网络服务 http client
    • 4.6 网络服务 https
    • 4.7 网络TCP net
    • 4.8 网络UDP dgram
    • 4.9 域名解析 dns
    • 5.0 网络地址解析 url
    • 5.1 URL查询字符串 querystring
    • 6.1 流操作 stream
    • 6.2 逐行读取 readline
    • 7.1 进程相关 process
    • 7.2 子进程 child
    • 8.1 二进制数据 buffer
    • 8.2 二进制解码 string_decoder
    • 9.1 事件机制 events
    • 9.2 实用工具模块 util
    • 9.3 数据加密 crypto
    • 9.4 MD5入门介绍及crypto模块的应用
    • 9.4 资源压缩 zlib
    • 9.5 集群 cluster
    • 9.6 v8
  • 进阶篇

    • 5分钟入门非对称加密用法
    • cluster
    • cookie_parser深入
    • crypto模块之理论篇
    • express+cookie_parser签名机制深入剖析
    • express+session实现简易身份认证
    • https
    • log4js入门实例
    • node8_napi
    • 使用 async 控制并发
    • 使用 eventproxy 控制并发
    • 使用 superagent 与 cheerio 完成简单爬虫
    • 基于express+muter的文件上传
    • 将图片转成datauri嵌入到html
    • 常用中间件 body_parser 实现解析
    • 日志模块morgan
    • 服务端字符编解码&乱码处理 charset_enc_dec
    • 测试用例mocha,should,istanbul
    • 调试日志打印debug模块
  • Express

    • 1.1 Express概览篇
    • 1.2 Express
  • Koa2

    • 1.0 koa2概览篇
    • 1.1 快速开始
    • 1.2 async await使用
    • 1.3 koa2简析结构
    • 1.4 koa中间件开发与使用
    • 10.1 单元测试
    • 11.1 开发debug
    • 12.1 快速启动
    • 12.2 框架设计
    • 12.3 分层操作
    • 12.4 数据库设计
    • 12.5 路由设计
    • 12.6 webpack4环境搭建
    • 12.7 使用react
    • 12.8 登录注册功能实现
    • 12.9 session登录态判断处理
    • 13.1 import export使用
    • 2.1 原生koa2实现路由
    • 2.2 koa router中间
    • 3.1 GET请求数据获取
    • 3.2 POST请求数据获取
    • 3.3 koa bodyparser中间件
    • 4.1 原生koa2实现静态资源服务器
    • 4.2 koa static中间件
    • 5.1 koa2使用cookie
    • 5.2 koa2实现session
    • 6.1 koa2加载模板引擎
    • 6.2 ejs模板引擎
    • 7.1 busboy模块
    • 7.2 上传文件简单实现
    • 7.3 异步上传图片实现
    • 8.1 mysql模块
    • 8.2 async await封装使用mysql
    • 8.3 项目建表初始化
    • 9.1 原生koa2实现JSONP
    • 9.2 koa jsonp中间件
  • 其他

    • 操作数据库
    • Session 与 Token
    • Cookie、Session、Token、JWT
    • Socket
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

开发debug|Nodejs专题系列

# 开发debug

30 秒速记

  • node --inspect index.js 打开调试端口,默认 127.0.0.1:9229
  • Chrome 打开 chrome://inspect,或点 DevTools 里的绿色 Node 图标连接
  • 想停在第一行用 --inspect-brk,启动阶段的代码才来得及打断点
  • VS Code 用 launch.json 或「JavaScript Debug Terminal」调试更顺手
  • 别把 --inspect=0.0.0.0 暴露到公网,连上调试端口等于能执行任意代码

调试 Node 最直接的办法是用 --inspect 启动,让进程开一个调试端口,再用 Chrome DevTools 连上去,像调前端页面一样打断点、看变量。 默认监听 127.0.0.1:9229,打开 chrome://inspect 就能看到目标进程。代码在启动时就执行完的话来不及打断点,这时用 --inspect-brk,进程会停在第一行等你。日常开发我更多在 VS Code 里调,原理一样,都是走 Inspector 协议。要注意调试端口绝不能开到公网,它能直接执行任意代码。

理解「开发debug」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 testing 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

Node 调试的底层是 V8 Inspector 协议:--inspect 让进程起一个 WebSocket 服务,调试器(Chrome DevTools、VS Code)连上去后通过它下发断点、单步、读取变量这些指令。常用的几种启动方式:

node --inspect index.js            # 开调试端口,代码照常运行
node --inspect-brk index.js        # 开调试端口,并停在第一行
node --inspect=9230 index.js       # 换端口,多个服务同时调试时用
nodemon --inspect index.js         # 改代码自动重启,配合专用 DevTools 窗口自动重连
@前端进阶之旅: 代码已经复制到剪贴板

VS Code 里最省事的是打开「JavaScript Debug Terminal」,在这个终端里跑 npm run dev,会自动挂上调试器,不用写配置。环境要求方面,--inspect 从 Node 6.3 开始提供,Node 8 起移除了旧的 --debug,现在所有在维护的 Node 版本都可以直接用。安全上要记住:调试端口能执行任意代码,默认绑 127.0.0.1 就是为了不让外部访问,改成 0.0.0.0 只能出现在本地容器开发里。

面试官追问

追问 1启动阶段的初始化代码打不上断点,一运行就过去了,怎么办?
参考回答

换成 node --inspect-brk index.js,进程会停在第一行等调试器连上,这时再打断点然后继续执行。

追问 2服务跑在 Docker 里,本机 Chrome 连不上调试端口,为什么?
参考回答

--inspect 默认只监听容器内的 127.0.0.1,要改成 --inspect=0.0.0.0:9229 并映射端口 -p 9229:9229。只在本地开发这么做,线上环境不要开。

追问 3用 nodemon 自动重启,每次重启都要重新连调试器,烦不烦?
参考回答

nodemon --inspect index.js 就行,chrome://inspect 里点「Open dedicated DevTools for Node」打开的专用窗口会在进程重启后自动重连。

追问 4线上进程 CPU 飙高,能直接 --inspect 上去打断点吗?
参考回答

不建议,断点会让整个进程停住,所有请求都卡死。线上一般是抓 CPU profile 或堆快照带回本地分析,比如用 node --cpu-prof 或者给进程发 SIGUSR1 临时开启 Inspector,抓完立刻关。

# 开发debug

# 快速开始

30 秒速记

  • 三步:node --inspect index.js 启动 → 终端打印 Debugger listening on ws://... → Chrome 里连上
  • 连接入口:DevTools 左上角绿色 Node 图标,或者 chrome://inspect 的 Remote Target
  • 打开专用调试窗口后,在 Sources 面板找到文件打断点,再发请求触发
  • 环境:Node 8+、Chrome 60+ 就能用,现在的版本都满足
  • 终端里的 ws:// 地址带随机 UUID,每次启动都会变,手动连要重新复制

快速上手就三步:用 --inspect 启动服务,在 Chrome 里找到这个 Node 进程打开专用 DevTools,然后在 Sources 面板打断点、发请求触发。 启动后终端会打印一行 Debugger listening on ws://127.0.0.1:9229/...,说明调试端口开好了。打开任意页面的 DevTools,左上角会多出一个绿色的 Node 图标,点它就能进入调试窗口;也可以访问 chrome://inspect 找目标。断点打在路由处理函数里,再用浏览器或 curl 请求一下接口,代码就会停下来,可以看 ctx 里的内容。

理解「快速开始」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

面试官追问

追问 1DevTools 里没看到绿色的 Node 图标,怎么排查?
参考回答

先看终端有没有打印 Debugger listening,没有就是启动参数没带上。打印了的话打开 chrome://inspect,检查 Configure 里有没有 localhost:9229,端口改过的话要把新端口加进去。

追问 2断点打上了,请求过来却没停,可能是什么原因?
参考回答

常见是断点打在了 TypeScript 源码或打包产物上但没开 sourcemap,或者请求压根没走到这个分支。可以先在函数第一行写个 debugger;,确认调试器确实生效。

追问 3同时启动两个服务都带 --inspect,第二个报端口占用,怎么办?
参考回答

默认都抢 9229。给第二个指定端口 --inspect=9230,或者写 --inspect=0 让系统随机分配,终端会打印实际端口。

追问 4断点停在路由里时,怎么查看当前请求的参数?
参考回答

右侧 Scope 面板直接展开 ctx,看 ctx.query、ctx.request.body;也可以在 Console 里输入 ctx.headers 实时求值,作用域就是当前断点所在的函数。

追问 5调试时日志太多,分不清哪条属于哪个请求,怎么办?
参考回答

给每个请求注入一个 requestId,用 AsyncLocalStorage 在整条异步链里传递,所有日志都带上它。按 requestId 一过滤,单个请求的完整轨迹就出来了。

# 环境

30 秒速记

  • 调试 Koa 服务的最低配置:Node.js 8.x+(--inspect 已稳定、原生支持 async/await)+ Chrome 60+(DevTools 里有 Node 入口)
  • Koa 2 本身要求 Node 7.6+,因为中间件全是 async 函数
  • 用到 AsyncLocalStorage 的示例要 Node 12.17+ / 13.10+,16.4 才算稳定,现在直接上 Node 18+ 省心
  • 示例代码写的是 import,要么文件叫 .mjs,要么 package.json 里加 "type": "module"
  • Chrome 只是调试前端界面,代码真正跑在 Node 进程里,版本以服务端 node -v 为准

这一节要的就两样东西:Node.js 8.x 以上,Chrome 60 以上。 Node 8 开始 --inspect 调试协议是正式的,Chrome 能直接连上去打断点;Chrome 60 之后 DevTools 左上角会出现一个绿色的 Node 图标,点一下就能打开专门调 Node 的窗口。要注意的是这只是调试本身的门槛,后面用到 AsyncLocalStorage 的例子至少要 Node 12.17,所以我一般建议直接装个 Node 18 或 20 的 LTS 版本,再用 nvm 按项目切版本。

  • node环境 8.x +
  • chrome 60+

理解「环境」时,要先明确输入、运行阶段和可观察输出。这里的交互实验会分别执行正常路径与失败路径,并把 Node.js 的关键状态变化和同屏代码对应起来;不能只记命令名称。

工程中还要验证退出码、资源清理和异常输入。属于 module 场景的配置应保持最小可复现,并在开发环境与 CI 中使用相同命令复跑,避免把平台差异或隐式默认值带到线上。

调试环境可以拆成两半来理解:被调试的一方是 Node 进程,负责真正执行代码;调试界面的一方是 Chrome DevTools 或 VS Code,负责显示源码、断点和变量。两者之间走的是 Inspector 协议,本质是一个 WebSocket 连接。

所以版本要求也分两头。Node 8 起 --inspect 是正式能力,老的 --debug 被废弃;Koa 2 依赖原生 async/await,需要 Node 7.6+。Chrome 60 前后 DevTools 加入了 Node 专用入口,地址栏输入 chrome://inspect 也能看到所有可连接的 Node 进程。

实际搭环境时建议这么做:

# 用 nvm 固定版本
echo "20" > .nvmrc
nvm install && nvm use

node -v   # v20.x.x
@前端进阶之旅: 代码已经复制到剪贴板

再在 package.json 里加一条约束,版本不对的人一装依赖就会收到提示:

{
  "engines": { "node": ">=18" }
}
@前端进阶之旅: 代码已经复制到剪贴板

后面用到 AsyncLocalStorage、node: 前缀导入、crypto.randomUUID() 的示例,在 Node 18+ 上都能直接跑;randomUUID 是 14.17 才加的,Node 8 上会直接报 is not a function。

← 10.1 单元测试12.1 快速启动 →

fe