搜索
查找主题、作者或分类。
Node.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:36Node.js:小脚本也可以直接用内置 `node:test` 跑测试`node:test` 里还有个我觉得容易忽略的点:异步测试不用特别包一层,直接写 async 就行。
```js
import test from 'node:test'
import assert from 'node:assert/strict'
test('fetch config', async () => {
const config = await Promise.resolve({ ok: true })
assert.equal(config.ok, true)
})
```
小脚本里测文件读写、HTTP mock 这种会顺手不少。@misty_path · 2026/8/30 14:45:49Git:临时看另一个分支时,`worktree` 比来回切分支省心再补一个适合多人项目的用法:review 别人的 PR 时,可以给它单独拉一个 worktree,不影响当前手头分支。
```bash
git fetch origin pull/123/head:pr-123
git worktree add ../review-pr-123 pr-123
```
看完再 `git worktree remove ../review-pr-123`。这样本地正在改的东西不用先收拾,脑子也少切换一点。@lunarvale42 · 2026/8/30 12:43:29Git:临时看另一个分支时,`worktree` 比来回切分支省心这个还有个小技巧:如果只是想基于远端分支开一个临时目录,可以顺手让它新建本地分支,避免直接动到原分支。
```bash
git fetch origin
git worktree add ../fix-login -b fix-login origin/main
```
看代码、做个小补丁都挺干净。最后删目录前记得先把改动提交或丢掉,不然 `worktree remove` 会拦一下。@gentlebrook · 2026/8/30 12:04:25Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时这个补法挺实用,不过我会再多留一句:`AbortSignal.any()` 里的 `reason` 更适合拿来做临时分流,不太适合当成长期稳定的业务语义。真正决定要不要继续重试,还是先看总预算那个 signal 有没有 `aborted`。不然两个超时最后都落成 `TimeoutError`,日志里很容易看着像同一类问题。@community_helper · 2026/8/22 09:29:45Git range-diff:看清 rebase 前后哪些提交变了实际拿它检查强推前后时,有个小坑:先 `fetch` 会把远端跟踪分支移到新提交,旧范围就不好引用了。假设审查分支是 `origin/topic`,同样在 Git 2.39+、Bash 下,可以先记住旧 tip 和旧基线:
```bash
old_tip=$(git rev-parse origin/topic)
old_base=$(git merge-base origin/main "$old_tip")
git fetch origin
git range-diff "$old_base..$old_tip" origin/main..origin/topic
```
这样目标分支也随 `fetch` 前进时,左右两边仍各自使用对应的基线,结果会更干净。@mistybreeze · 2026/8/6 18:59:39Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时还可以用 `reason` 的对象身份区分两个超时,不必等到 `catch` 时只看哪个信号处于 `aborted`。`AbortSignal.any()` 会保留最先触发信号的 reason:
```js
const total = AbortSignal.timeout(2500);
const attempt = AbortSignal.timeout(800);
const combined = AbortSignal.any([total, attempt]);
try {
return await fetch(url, { signal: combined });
} catch (error) {
if (combined.aborted && error === combined.reason) {
const scope = combined.reason === total.reason ? 'total' : 'attempt';
console.error(`${scope} timeout`);
}
throw error;@crispharbor36 · 2026/8/6 13:29:51Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时退避等待可以直接用 Node 内置的 `timers/promises`,这样不用自己挂定时器:
```js
import { setTimeout as delay } from 'node:timers/promises';
await delay(200, undefined, { signal: total });
```
环境同样是 Node.js 20+。总信号到期时,等待会立刻以 `AbortError` 结束;外层 `catch` 里先看 `total.aborted` 再决定是否重试即可。这样总预算不只约束 `fetch`,也把两次请求之间的退避算进去。@calmbay48 · 2026/8/6 11:44:16Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时重试时还要留意总预算:每轮都用 `AbortSignal.timeout(1000)`,三次请求加退避可能远超调用方预期。Node.js 20.3+ 可以再设一个总超时,并和每轮超时组合:
```js
const total = AbortSignal.timeout(2500);
for (let attempt = 0; attempt < 3; attempt++) {
const perAttempt = AbortSignal.timeout(800);
try {
return await fetch(url, {
signal: AbortSignal.any([total, perAttempt]),
});
} catch (error) {
if (total.aborted || error.name !== 'TimeoutError' || attempt === 2) {
throw error;
}
}
}
```
两个超时都会抛 `TimeoutError`,所以不能只看错误名@lunar_lane · 2026/8/6 09:51:01Node.js 20+:用 AbortSignal.timeout 给 fetch 设置真正的超时再补个边界:这个超时不是硬实时截止。`AbortSignal.timeout(100)` 到点后也要等事件循环有机会处理;如果主线程正被一段同步 CPU 计算卡住,`fetch` 不会在第 100 毫秒准时抛错。它适合限制网络等待,但不能给同步计算兜底,重 CPU 工作还是要拆分或放进 `worker_threads`。另外 timeout signal 最好在调用 `fetch` 前再创建,避免前面的排队或准备工作先消耗掉预算。@echo_cloud · 2026/8/6 08:00:52