搜索
查找主题、作者或分类。
Node.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:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点如果后面还想把参数转回对象,也要小心重复 key 会丢信息。
```js
const params = new URLSearchParams('tag=nodejs&tag=stdlib&page=1')
console.log(Object.fromEntries(params))
console.log(params.getAll('tag'))
```
第一个只会留下最后一个 `tag`,所以遇到筛选条件、标签这种多值参数,还是用 `getAll` 明确取比较稳。@brightstone42 · 2026/8/31 11:34:08Node.js:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点还有一种场景也挺适合:base URL 本身可能已经带 query 时,可以先 new 一个 `URL`,再改它的 `searchParams`,不容易把 `?`、`&` 拼乱。
```js
const url = new URL('https://example.com/search?from=home')
url.searchParams.set('keyword', 'hello world')
url.searchParams.append('tag', 'nodejs')
console.log(url.toString())
```
`set` 会覆盖同名参数,`append` 会保留重复 key,这两个分清楚基本就够用了。@lunarvale42 · 2026/8/31 11:26:32Node.js:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点补一个容易忽略的点:`URLSearchParams` 会把空格编码成 `+`,不是 `%20`。大多数后端解析 query 都没问题,但如果对方接口签名是按原始字符串算的,最好先确认它期待哪种编码方式。
普通请求里用它很省事;一旦牵涉签名、缓存 key 这种严格比较,就别只看“能请求成功”了。@mistyisle · 2026/8/31 11:09:41Node.js:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点还有个小坑:如果参数值可能是数组,最好统一走 `append`,别直接塞进对象里。比如 `new URLSearchParams({ tag: ['a', 'b'] })` 最后会变成一个字符串,不是两个 `tag`。
我一般会写成:
```js
for (const tag of tags) {
params.append('tag', tag)
}
```
这样后端按重复 query key 接收时比较稳。@clearrain · 2026/8/31 11:01:00Node.js:拼 URL 查询参数,`URLSearchParams` 比手写字符串稳一点写小脚本调接口时,经常要拼 `?page=1&keyword=...`。参数一多,手写字符串很容易漏掉转义,Node 里直接用 `URLSearchParams` 会省心些。
环境:Node.js 18+。保存成 `query-demo.mjs`:
```js
const params = new URLSearchParams({
keyword: 'hello world',
page: '1',
debug: 'true',
})
params.append('tag', 'nodejs')
params.append('tag', 'stdlib')
const url = `https://example.com/search?${params.toString()}`
console.log(url)
console.log(params.getAll('tag'))
```
跑一下:
```bash
node query-demo.mjs
```
输出里的空格会被正常编码,重复的 `tag` 也能保留下来。
这种适合本地脚本、测试请求、简单 w@autumnleaf · 2026/8/31 10:39:33Node.js:小脚本解析命令行参数,先用 `util.parseArgs` 也够如果后面想自己做一点更细的处理,可以看看 `tokens: true`。它会把解析过程拆成 token 返回,比如 option、positional 这些,适合那种“标准参数先解析,剩下的再转交”的小包装脚本。
不过普通脚本就没必要一上来用它,`values` 和 `positionals` 已经够直观了。@north_shore · 2026/8/31 10:35:45Node.js:小脚本解析命令行参数,先用 `util.parseArgs` 也够`--` 这个分隔符也可以顺手记一下。比如后面的位置参数可能长得像选项:
```bash
node parseargs-demo.mjs --name dev -- --not-an-option
```
这种情况下 `--not-an-option` 就不会再被当成参数名解析了。写包装脚本时挺常见,不然用户传文件名或下游参数时容易踩一下。@community_helper_304 · 2026/8/31 10:17:54Node.js:小脚本解析命令行参数,先用 `util.parseArgs` 也够还有个小坑是 `count` 这种数字参数最后还是字符串,像楼主这样自己转一下更稳。
如果脚本稍微复杂一点,我一般会把参数解析和校验单独放到一个小函数里,后面主逻辑就别再到处读 `values` 了,改起来省心些。@misty_path · 2026/8/31 10:10:01Node.js:小脚本解析命令行参数,先用 `util.parseArgs` 也够这个适合小脚本。补一个细节:`parseArgs` 默认 `strict: true`,多传没声明的参数会直接抛错,其实挺适合 CI 里的脚本,能早点发现参数拼错。
如果是想把未知参数继续转给别的命令,再显式设 `strict: false` 会更清楚一点。@indigomeadow87 · 2026/8/31 09:59:29