vscode本身不提供https服务,配置本质是让node.js脚本启用https.server;必须使用https模块并提供本地key/cert文件,launch.json需设cwd为${filedirname}、env为node_env=development,并避免用code-runner启动。

VSCode 本身不提供 HTTPS 服务,所谓“配置 Node.js 的 HTTPS 运行环境”,本质是让你的 Node.js 脚本在本地启用 HTTPS Server,并在 VSCode 中正确启动、调试它——不是给 VSCode 加 SSL,而是让 node 进程跑起来时用 https.Server。
为什么直接用 http.createServer() 无法启用 HTTPS
Node.js 的 http 模块只处理明文 HTTP;HTTPS 必须用内置的 https 模块,且需提供证书(key 和 cert)。常见错误是照搬 HTTP 示例却没换模块、没加证书路径,导致启动报错:Error: error:0900006e:PEM routines:OPENSSL_internal:NO_START_LINE 或直接静默退出。
- 证书不能是远程 URL,必须是本地文件路径(如
./certs/server.key),且路径需相对于脚本执行目录(不是 VSCode 工作区根目录) - 自签名证书可用
openssl生成,但浏览器会提示不安全——开发阶段可接受,无需 CA 签发 - 若用
process.env.NODE_ENV === 'production'分支逻辑,记得在 VSCode 启动时设环境变量,否则可能跳过 HTTPS 分支
如何在 launch.json 中正确启动 HTTPS Server
VSCode 的调试器不关心协议类型,只负责执行你的 JS 文件。关键在于 launch.json 的 program 指向含 https.createServer() 的入口文件,且确保该文件能读到证书。
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- 不要写死证书路径:用
path.join(__dirname, 'certs', 'server.key'),避免跨平台路径错误 - 在
launch.json中添加"env": { "NODE_ENV": "development" },确保环境变量生效 - 若证书路径含空格或中文,Node.js 可能读取失败——改用英文路径,如
./ssl/key.pem - 端口别用 443(需 root 权限):开发建议用
8443或3001,并在https.createServer(options, app).listen(8443)中显式指定
用 code-runner 插件跑 HTTPS 脚本的风险
code-runner 默认用 node $fileName 执行,但它不支持传入环境变量、不捕获 stderr、也不等异步 server 启动就结束进程——结果就是控制台一闪而过,浏览器打不开 https://localhost:8443。
- 绝对不要用它启动 HTTPS Server:改成手动终端运行
node ./server.js,或改用调试模式(F5) - 如果硬要用,必须重写
code-runner.executorMap的javascript条目,加上env和timeout参数(但插件本身不支持,实测无效) - 遇到
self signed certificate in certificate chain错误?那是 Node.js 默认拒绝自签名证书——加process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'(仅开发)
证书生成与调试时的实际路径问题
很多人卡在“找不到证书文件”,根本原因是 VSCode 调试时的当前工作目录(process.cwd())不等于脚本所在目录。比如你在 /project/src/ 下打开 server.js,但 launch.json 的 cwd 默认是 /project。
- 验证方式:在脚本开头加
console.log('CWD:', process.cwd(), 'DIRNAME:', __dirname) - 解决办法:在
launch.json中显式设"cwd": "${fileDirname}",让工作目录和脚本同级 - Windows 用户注意:OpenSSL 生成的
.pem文件可能带 BOM,Node.js 读取会失败——用 VSCode 以 UTF-8 无 BOM 编码保存证书文件
最常被忽略的一点:HTTPS Server 启动后不会自动打开浏览器,你得手动访问 https://localhost:8443(并点击“高级 → 继续前往”);调试断点也只在请求到达时触发,不是一启动就停住——这点和 HTTP 完全不同。










