fetch 与 HTTP 客户端
fetch、axios、got、ky。
25 分钟
fetch 与 HTTP 客户端
Node 18+ 内置 全局 fetch,BFF 与脚本里调外部 API 不必再强绑 axios。不同客户端在 拦截器、超时、流式下载、TypeScript 体验 上各有取舍。
学习目标
- 用原生 fetch 完成 GET/POST 与错误处理
- 对比 axios、got、ky 的典型用法
- 在 Fastify/Hono handler 中安全调用第三方 API
原生 fetch
const res = await fetch("https://api.example.com/tracks", {
headers: { Accept: "application/json" },
signal: AbortSignal.timeout(5000),
});
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${await res.text()}`);
}
const data = await res.json();
注意:fetch 仅在 !res.ok 时 不会 自动抛错,需显式判断。
库对比(选型)
| 库 | 优势 | 注意 |
|---|---|---|
| fetch(内置) | 零依赖、标准 API | 拦截器需自封装 |
| axios | 拦截器、广泛示例 | 体积较大;浏览器/Node 通用 |
| got | Node 专用、重试/分页 | 偏 Node 脚本与服务端 |
| ky | 轻量、基于 fetch | 主要 ESM;适合现代小服务 |
在 nodejs-essentials 的 HTTP 课基础上,框架课重点放在 服务内 outbound 调用:调支付网关、CMS、Java 主 API(:8080)等。
实践建议
// 封装:基址 + 超时 + JSON
async function apiGet(path) {
const res = await fetch(`${process.env.API_BASE}${path}`, {
signal: AbortSignal.timeout(8000),
});
if (!res.ok) throw new Error(`upstream ${res.status}`);
return res.json();
}
- 密钥走
process.env,见 node-env - 出站失败要有 降级或明确 502,别吞错
- 高并发出站配合 nodejs-advanced-essentials 的连接与超时策略
练习
- 用 fetch 调一个公开 JSON API 并打印字段
- 用 axios 实现同一调用,对比错误对象结构
- 在 Fastify 路由里代理
GET /api/tracks到 mock 上游