可以,Node.js 18.0+ 默认启用全局 fetch API(实验性),但仅在 ESM 环境(.mjs 或 "type": "module")下可用;CommonJS 中会报 ReferenceError,需切换模块系统或使用 node-fetch/undici 等替代方案。

直接用 fetch 最省事,但 Node.js 默认不支持——得确认版本 ≥ 18 且没禁用全局 fetch;否则老老实实用 https 模块 + util.promisify 或第三方库。
Node ≥ 18 时能否直接用 fetch?
可以,但不是“开箱即用”:Node.js 18.0+ 默认启用 fetch,但仅限 ESM(.mjs 或 package.json 中设 "type": "module")。CommonJS(.js)下会报 ReferenceError: fetch is not defined。
- ESM 项目:直接
await fetch('https://api.example.com'),无需引入 - CommonJS 项目:要么改后缀/.mjs,要么加
"type": "module",否则必须换方案 - 注意:
fetch不自动带上Content-Type或处理 form-data,POST 时要手动设headers和body
https.request 怎么写才不卡死?
原生 https 模块是纯回调风格,漏掉 req.end() 或没监听 error 事件,请求就挂起、无报错、也无响应——这是最常踩的坑。
- 必须显式调用
req.end(),哪怕 GET 请求没 body 也要写 -
req.on('error', ...)不能省,网络失败、DNS 解析失败等都走这里,不监听就静默失败 - GET 参数拼在
path里,别塞进hostname(如hostname: 'https://api.com'错!应为hostname: 'api.com',path: '/v1?x=1') - POST 提交表单要用
querystring.stringify()编码,否则服务端收不到字段
如何把 http/https 调用变成 async/await?
不用装额外包,Node 自带 util.promisify 就够用,但只适用于标准 Node 回调签名((err, data) => {}),而 https.request 返回的是 ClientRequest 实例,不能直接 promisify。
- 正确做法:封装一层 Promise,监听
response和req.on('error'),再用stream.pipeline或手动res.on('data')收集 body - 更简单:用
util.promisify包裹https.get(它接受回调,可 promisify),但https.get只支持 GET,不支持 POST/PUT 等 - 若需全动词支持,推荐轻量库如
node-fetch(CJS/ESM 都行)或undici(Node 官方底层 HTTP/1.1 客户端,性能好)
调试 await fetch 断点不生效怎么办?
不是语法问题,是 VSCode 没加载 source map 或运行时未启用 inspector 协议。
- 确保
launch.json含"sourceMaps": true,且项目生成了.map文件(TS 编译需"sourceMap": true) - ESM 项目启动时加
--enable-source-maps(Node ≥ 14.18),即runtimeArgs: ["--enable-source-maps"] - 避免混用
outFiles和resolveSourceMapLocations,后者更可靠,推荐配"resolveSourceMapLocations": ["${workspaceFolder}/**"] - 断点设在
await行本身不会停住,要设在后续语句(如const res = await fetch(...); console.log(res)的console.log行)
真正麻烦的从来不是发请求,而是错误边界没兜住、body 没完整读完、HTTPS 证书校验被绕过却忘了上线关掉——这些细节一漏,线上就静默失败。


















