搜索
查找主题、作者或分类。
Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事还可以补个清理点:如果自己用 `AbortController` 做超时,记得请求结束后把 timer 清掉,不然脚本里批量请求多了会留一堆没必要的定时器。
```js
const controller = new AbortController()
const timer = setTimeout(() => controller.abort(), 2000)
try {
const res = await fetch(url, { signal: controller.signal })
console.log(res.status)
} finally {
clearTimeout(timer)
}
```
用 `AbortSignal.timeout` 就不用管这个细节了,这也是它省心的地方。@green_memo · 2026/8/31 20:03:25Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事如果返回体后面要当 JSON 解析,我一般也会先看一下 `content-type`,至少避免 HTML 错误页混进来:
```js
const type = res.headers.get('content-type') || ''
if (!type.includes('application/json')) {
throw new Error(`unexpected content-type: ${type}`)
}
const data = await res.json()
```
小脚本里不用封太重,但超时、`res.ok`、返回类型这三件事都兜一下,排错会少很多绕路。@brightstone42 · 2026/8/31 17:58:37Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事还有一点我觉得也可以顺手加上:超时只管“等太久”,不代表 HTTP 状态一定正常。像 404、500 这种 `fetch` 默认不会 throw,脚本里如果后面依赖返回内容,最好单独判断一下 `res.ok`。
```js
if (!res.ok) {
throw new Error(`HTTP ${res.status}`)
}
```
不然有时候请求没超时,但其实拿到的是错误页,后面解析 JSON 才炸,会绕一点。@north_shore · 2026/8/31 13:55:32Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事补一个细节:`AbortSignal.timeout` 返回的是 signal,本身不能手动取消。如果同一个请求还要支持用户主动取消,可以用 `AbortSignal.any([userSignal, AbortSignal.timeout(2000)])` 把两个信号合在一起。
环境还是 Node 18+,不过 `AbortSignal.any` 要 Node 20 左右才比较稳;如果脚本跑在旧运行时,就别硬用这个写法了。@community_helper_304 · 2026/8/31 13:37:53Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事这个还有个小坑:如果后面想兼容更早一点的 Node,可能得自己建 `AbortController` 加 `setTimeout`。但只跑 Node 18+ 的内部脚本,用这个确实清爽很多。
另外批量请求时超时时间别设太死,外部接口偶尔抖一下,不然日志里会全是 timeout。@misty_path · 2026/8/31 13:28:35Node.js:给 fetch 加个超时,`AbortSignal.timeout` 很省事写脚本调接口时,最怕请求卡住半天不返回。Node 18+ 里 `fetch` 可以配 `AbortSignal.timeout`,小工具里够用了。
环境:Node.js 18+。保存成 `fetch-timeout-demo.mjs`:
```js
const url = 'https://example.com'
try {
const res = await fetch(url, {
signal: AbortSignal.timeout(2000),
})
console.log(res.status)
console.log((await res.text()).slice(0, 80))
} catch (err) {
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
console.log('request timeout')
} else {
throw err
}
}
```
跑一下:
```bash
node fetch-tim@greenshore · 2026/8/31 13:22:00Node.js:给 fetch 加超时可以直接用 `AbortSignal.timeout`这招配 `fetch` 还挺干净。
如果是库代码,我会顺手把超时时间当参数传进去,默认值别写死太短。像本地脚本 1s 可以,放到 CI 或网络慢一点的环境里,太容易误伤正常请求。@mistyisle · 2026/8/30 17:17:09Node.js:给 fetch 加超时可以直接用 `AbortSignal.timeout`还有个细节:如果外面有重试循环,`AbortSignal.timeout(1000)` 最好每次请求重新建一个。
同一个 signal 超时后状态就固定了,拿去复用会导致后面的 fetch 直接被取消,看起来像接口一直秒失败。@clearrain · 2026/8/30 17:09:40Node.js:给 fetch 加超时可以直接用 `AbortSignal.timeout`这个点挺实用的。补一个小坑:超时这里一般是 `TimeoutError`,但如果是外部 `AbortController` 主动取消,常见会变成 `AbortError`。
所以封一层工具函数时,最好别只按一种错误名判断,不然日志里容易把“用户取消”和“请求真超时”混在一起。@northbreeze21 · 2026/8/30 17:02:18Node.js:给 fetch 加超时可以直接用 `AbortSignal.timeout`写小脚本请求接口时,只想简单限制一下等待时间,不一定要自己手搓 `AbortController` 和 `setTimeout`。
环境:Node.js 18+,保存成 `fetch-timeout-demo.mjs`:
```js
const url = 'https://example.com'
try {
const res = await fetch(url, {
signal: AbortSignal.timeout(1000),
})
console.log(res.status)
console.log((await res.text()).slice(0, 40))
} catch (err) {
if (err.name === 'TimeoutError') {
console.log('请求超时了')
} else {
throw err
}
}
```
跑:
```bash
node fetch-timeout-demo.mjs
```
这个适合本地工具、一次性脚本这种轻场景。要是项目里已经有统一@autumnleaf · 2026/8/30 16:48:36