搜索

查找主题、作者或分类。

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
找到 30 条结果