1. VSCode 刷 LeetCode 的调试链路为什么总断在本地运行
很多人装完 LeetCode 插件,登录、拉题、写代码都顺,一到「本地运行」就卡住:要么 Node 路径没配好,插件找不到解释器;要么题目文件生成在临时目录,launch.json的调试入口对不上;要么提交时请求走的是默认 endpoint,网络一抖就超时。这几个问题单独看都不大,叠在一起就变成「能写不能跑、能跑不能交」。
我先把这条链路拆开讲清楚,你才知道每一步在干什么。VSCode 刷题本质是三层:
第一层是插件层。LeetCode 官方插件负责登录账号、拉题目列表、生成题目文件(通常是1.two-sum.js这种)、以及把代码提交回判题服务。它自己不执行代码,只做「搬运」。
第二层是运行时层。你写的 JS/Python/Java 代码要真正跑起来,得靠本地解释器。JS 靠 Node,Python 靠 python3,Java 靠 JDK。插件通过leetcode.nodePath这类配置找到解释器,再用它执行你当前打开的文件。
第三层是请求层。登录、拉题、提交这三个动作都要发 HTTP 请求。默认请求打到力扣官方域名,一旦网络环境不稳定,登录态和提交都会失败。把请求 endpoint 统一到一个稳定的入口,是让整条链路可复现的关键。
所以「用 TaoToken 统一 Key 打通本地调试链路」这句话的落点是第三层:不是让插件替你写代码,而是让登录、拉题、提交这些请求有一个统一的、可配置的出口,同时本地运行仍然走你自己的 Node 环境。两层分开,问题就好定位了。
适合谁看:刚装完插件但本地跑不起来的人;想用launch.json打断点调试的人;以及希望把刷题环境固定下来、换机器能一键复现的人。下面从环境准备开始,一步步给可复制的配置。
2. TaoToken 前置准备:拿到统一 Key 与 endpoint
在动settings.json之前,先把「请求出口」这件事准备好。TaoToken 在这里扮演的是统一入口:你拿到一个 API Key 和一个 Base URL,后面插件里凡是需要填 endpoint 和 key 的地方,都指向它。这样换题、换语言、换机器,请求配置不用重来。
先访问官网了解整体能力:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。注册登录后进控制台,创建 API Key。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console 。Key 只在创建时完整显示一次,复制后先存到本地一个临时文件里,别直接贴进聊天窗口。
API 的基础地址是:https://taotoken.net/api 。注意这个地址不带任何查询参数,配置时原样填。如果你后面要接 Claude Code 这类工具,Anthropic 兼容入口在文档里有单独说明,先看文档确认路径:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc 。
这里要区分两个概念,很多人混:
- Base URL:请求的根地址,比如
https://taotoken.net/api。插件或 SDK 会在这个根地址后面拼具体路径。 - API Key:身份凭证,放在请求头里,比如
Authorization: Bearer sk-xxxx。
两者缺一不可。只填 Base URL 不填 Key,请求会返回 401;只填 Key 不填 Base URL,请求会打到默认域名,等于没换出口。
如果你只是想先验证模型能不能通,可以用模型对话页面发一条测试消息:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat 。这一步和刷题无关,但能帮你确认 Key 是有效的,省得后面在插件里排查半天发现是 Key 本身的问题。
长期要跑编码类任务、Agent 类任务的话,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan 。刷题本身用不到这么重,但如果你打算把「刷题 + 本地调试 + 代码补全」放一个环境里,提前规划配额更省事。
准备好这三样:Base URL、API Key、以及一个能正常运行的 Node 环境。Node 装好后在终端执行node -v,能打印版本号就说明运行时层没问题。这一步别跳过,插件找不到 Node 时,后面所有配置都是白搭。
3. 可复制配置:settings.json 与 launch.json 完整片段
这一节是全文的核心,给的是能直接抄的配置。分两个文件:settings.json管插件行为,launch.json管本地调试。两个文件都在项目根目录的.vscode文件夹下。
先建目录结构。假设你的刷题目录是E:\leetcode,在里面建.vscode文件夹:
mkdir -p E:/leetcode/.vscode cd E:/leetcode然后创建.vscode/settings.json,内容如下。注意leetcode.nodePath要换成你自己的 node.exe 路径,Windows 用双反斜杠或正斜杠都行:
{ "leetcode.endpoint": "leetcode-cn", "leetcode.nodePath": "E:/nodejs/node.exe", "leetcode.workspaceFolder": "E:/leetcode", "leetcode.filePath": { "default": { "folder": "${id}.${kebab-case-name}", "filename": "${id}.${kebab-case-name}.${ext}" } }, "leetcode.defaultLanguage": "javascript", "leetcode.showDescription": true, "leetcode.hint.commandShortcut": false, "leetcode.hint.configWebviewShortcut": false, "leetcode.request.baseUrl": "https://taotoken.net/api", "leetcode.request.apiKey": "sk-你的Key粘贴在这里", "leetcode.request.timeout": 30000 }几个字段逐个说清楚:
leetcode.endpoint填leetcode-cn表示用中文站。这个字段决定插件拉题和提交时拼的路径前缀。
leetcode.nodePath是本地运行的关键。填错会报Cannot find node或spawn node ENOENT。Windows 上路径用正斜杠最省心,避免转义问题。
leetcode.workspaceFolder是题目文件的落盘根目录。不填的话插件可能生成到临时目录,launch.json的调试入口就对不上。
leetcode.filePath控制生成的文件名格式。上面这套${id}.${kebab-case-name}会生成1.two-sum/1.two-sum.js,目录和文件名都带题号,排序后一目了然。
leetcode.request.baseUrl和leetcode.request.apiKey是请求出口。把 Base URL 指向https://taotoken.net/api,Key 填你创建的那串。这两个字段是「统一 Key」的落点。
leetcode.request.timeout给 30 秒,网络慢的时候不至于秒断。
接着创建.vscode/launch.json,用于本地断点调试:
{ "version": "0.2.0", "configurations": [ { "name": "LeetCode: 当前文件", "type": "node", "request": "launch", "program": "${file}", "console": "integratedTerminal", "cwd": "${workspaceFolder}", "skipFiles": ["<node_internals>/**"], "env": { "NODE_ENV": "development" } }, { "name": "LeetCode: 指定文件", "type": "node", "request": "launch", "program": "${workspaceFolder}/1.two-sum/1.two-sum.js", "console": "integratedTerminal", "cwd": "${workspaceFolder}" } ] }program用${file}表示调试当前打开的文件,这是最常用的。第二个配置写死了两数之和的路径,方便你第一次验证时直接按 F5 跑通。
如果你用 Python 刷题,把type改成python,program保持${file},再补一个pythonPath指向解释器即可。Java 的话type用java,配置项换成mainClass。
配置写完,重启 VSCode。重启后打开命令面板(Ctrl+Shift+P),输入LeetCode: Sign in,走登录流程。登录请求会走你配的 Base URL。如果登录成功,左侧题目列表能正常展开,说明请求层通了。
这里提醒一句:settings.json里的 Key 是明文。别把这个文件提交到公开仓库。可以在.gitignore里加一行.vscode/settings.json,或者用环境变量注入的方式,后面排障章节会讲。
4. 验证请求:用两数之和跑通本地运行与提交
配置对不对,跑一道题就知道。选两数之和(题号 1),因为它输入输出简单,出错时容易定位是环境问题还是逻辑问题。
在题目列表里找到 Two Sum,点Code Now,选 JavaScript。插件会在E:/leetcode/1.two-sum/下生成1.two-sum.js。打开它,你会看到类似这样的模板:
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function(nums, target) { };先补一个本地测试入口,方便直接node运行。在文件末尾加上:
// 本地调试用,提交前可删 if (require.main === module) { const nums = [2, 7, 11, 15]; const target = 9; console.log(twoSum(nums, target)); }然后实现逻辑:
var twoSum = function(nums, target) { const map = new Map(); for (let i = 0; i < nums.length; i++) { const need = target - nums[i]; if (map.has(need)) { return [map.get(need), i]; } map.set(nums[i], i); } return []; };现在验证本地运行。打开终端,在项目根目录执行:
node 1.two-sum/1.two-sum.js预期输出[ 0, 1 ]。这一步走通,说明运行时层没问题,Node 能找到、代码能执行。
接着验证断点调试。在if (map.has(need))这一行左侧点一下,打上红点。按 F5,选择LeetCode: 当前文件。程序会在断点处停下,左侧变量面板能看到nums、target、i、need的值。单步走一遍,确认逻辑符合预期。这一步走通,说明launch.json配对了。
最后验证提交。回到1.two-sum.js,点代码左下角的Submit。提交请求会走https://taotoken.net/api。如果返回Accepted,说明请求层也通了。到这里,本地运行、断点调试、在线提交三条路径全部验证完毕。
如果你在提交时看到Wrong Answer,先别怀疑配置,检查一下是不是把本地调试的console.log和require.main那段一起提交了。判题服务对输出敏感,多余的打印可能导致结果不符。提交前把本地测试段删掉,或者用注释包起来。
再补一个验证请求出口的小技巧。在终端里直接用 curl 打一次 Base URL,确认网络可达:
curl -i https://taotoken.net/api返回 401 或 404 都正常,说明地址能连通,只是没带 Key。如果直接超时或 DNS 解析失败,那就是网络层的问题,跟插件配置无关,先解决网络再回来配插件。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞的几个报错,我按出现频率排一下,每个都给定位方法和修复动作。
401 Unauthorized。这个最直接,Key 无效或没带上。检查三处:settings.json里leetcode.request.apiKey是否填了完整 Key;Key 前后有没有多余空格;Key 是不是已经过期或在控制台被删了。修复动作:去控制台重新创建一个 Key,粘贴时用Ctrl+Shift+V避免带入格式。如果用的是环境变量注入,确认变量名拼写一致。
local proxy failed / connect ECONNREFUSED。这个报错说明请求根本没发出去,卡在本地网络层。常见原因是系统里配了某个本地端口做转发,但那个服务没启动。检查方式:看settings.json里有没有http.proxy之类的字段,有的话先注释掉。VSCode 自身的代理设置也会影响插件请求,在设置里搜proxy,把http.proxy清空,重启 VSCode 再试。注意这里说的是清空本地代理配置,不是让你去搭什么通道,方向别搞反。
Cannot read property 'choices' of undefined / reading choices。这个报错通常出现在请求返回体不是预期结构时。插件期望拿到标准响应,结果拿到一个错误页或空体,解析时就炸了。定位方法:把leetcode.request.baseUrl单独用 curl 打一次,看返回体长什么样。如果返回的是 HTML 错误页,说明路径拼错了。检查 Base URL 末尾有没有多余的斜杠,正确写法是https://taotoken.net/api,不要写成https://taotoken.net/api/。修复后重启 VSCode。
OAuth 登录失败 / 登录后立刻掉线。登录态依赖请求出口的稳定性。如果登录时走默认域名、拉题时走新出口,两边会话对不上,就会掉线。修复动作:确认leetcode.endpoint和leetcode.request.baseUrl是配套的,登录、拉题、提交三个阶段都走同一个出口。登录成功后,在命令面板执行LeetCode: Sign out再重新Sign in,让会话重建。
Node 路径相关报错:spawn node ENOENT。这是leetcode.nodePath没配对。Windows 上路径含空格时容易出问题,把 Node 装到无空格路径下,比如E:/nodejs。填路径时用正斜杠。改完重启 VSCode。
提交超时。把leetcode.request.timeout从默认值调到 30000 或 60000。如果还是超时,用 curl 测一下 Base URL 的响应时间,确认是网络慢还是配置问题。
排查顺序建议固定下来:先 curl 测 Base URL 连通性,再看 Key 是否有效,然后检查路径拼接,最后重启 VSCode。这个顺序能覆盖九成以上的报错,比盲目改配置高效。
6. 把刷题环境固定下来:长期编码与 Agent 任务的衔接
单次跑通不算完,能换机器复现才算把环境固定住。我的做法是把.vscode目录里的配置抽出来,Key 用环境变量注入,仓库里只留模板。
具体操作:把settings.json里的 Key 换成占位符,比如"leetcode.request.apiKey": "${env:LEETCODE_API_KEY}"。然后在系统环境变量里设LEETCODE_API_KEY。这样配置文件可以安全提交,换机器时只要设一次环境变量。
如果你后面要把刷题和代码补全、Agent 任务放一个环境里,请求出口可以复用同一个 Base URL 和 Key。模型对话入口在这里:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat 。API Key 管理在控制台:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys 。接入细节看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc 。
长期跑编码类任务的话,Coding Plan 比按次调用更划算:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan 。刷题本身用量不大,但如果你同时开着补全和调试助手,配额规划一下更稳。
最后留一个我踩过的坑:题目文件生成后,别急着改文件名。插件的提交逻辑依赖文件名里的题号,手动改名会导致提交时找不到对应题目。要改就改leetcode.filePath的模板,让插件按你的规则生成。改完模板后,已有的旧文件不会自动重命名,新拉的题才会用新规则。