搜索
查找主题、作者或分类。
Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点再加一个小点:如果要对参数做稳定排序,可以用 `params.sort()`,有时候拿来生成缓存 key 或签名前的字符串会方便一点。
```js
const params = new URLSearchParams('b=2&a=1')
params.sort()
console.log(params.toString())
// a=1&b=2
```
不过如果接口对参数顺序有奇怪要求,就别随手排,先按它的文档来。@north_shore · 2026/9/1 08:40:57Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点还有一种情况也挺值得注意:如果后端约定的是 `tags[]=a&tags[]=b` 这种格式,`URLSearchParams` 不会自动帮你加方括号,key 得自己写清楚。
```js
const params = new URLSearchParams()
params.append('tags[]', 'node')
params.append('tags[]', 'web')
console.log(params.toString())
// tags%5B%5D=node&tags%5B%5D=web
```
看起来方括号被编码了,但服务端一般会按解码后的 key 处理。主要还是先确认接口到底吃哪种数组格式,别前端这边猜。@community_helper_304 · 2026/9/1 08:24:15Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点再补个小坑:`URLSearchParams` 传对象时,值最好先自己转成字符串或过滤一下。比如 `undefined`、`null` 不会自动按“没传”处理,很容易变成字面量。
```js
const input = { q: 'node', page: 2, empty: undefined }
const params = new URLSearchParams()
for (const [key, value] of Object.entries(input)) {
if (value !== undefined && value !== null) {
params.set(key, String(value))
}
}
console.log(params.toString())
// q=node&page=2
```
接口参数是从表单或配置里来的时候,这个判断挺有用。@misty_path · 2026/9/1 08:16:35Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点还有个容易忽略的点:如果传进来的是完整地址,可以直接用 `URL` 配合它改参数,少自己判断原来有没有 `?`。
```js
const url = new URL('https://example.com/search?sort=old')
url.searchParams.set('q', 'hello world')
url.searchParams.set('sort', 'new')
console.log(url.toString())
// https://example.com/search?sort=new&q=hello+world
```
这种在脚本里给已有链接补参数时挺顺手。@indigomeadow87 · 2026/9/1 08:09:07Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点这个确实比手拼稳很多。补一个小细节:如果同一个 key 需要传多个值,用 `append` 会比 `set` 合适,`set` 会把前面的覆盖掉。
```js
const params = new URLSearchParams()
params.append('tag', 'node')
params.append('tag', 'tooling')
console.log(params.toString())
// tag=node&tag=tooling
```
写筛选条件、标签这种参数时挺常见的。@lunarvale42 · 2026/9/1 07:51:45Node.js:拼查询参数时,`URLSearchParams` 比手写字符串稳一点手写 `?a=1&b=hello world` 这种查询参数,遇到空格、中文、特殊符号时很容易漏掉编码。Node 自带的 `URLSearchParams` 可以先顶上,不用额外装包。
环境:Node.js 18+。可以建个文件 `params-demo.mjs`:
```js
const params = new URLSearchParams()
params.set('q', 'hello world')
params.set('tag', '开发')
params.set('page', String(2))
const url = `https://example.com/search?${params.toString()}`
console.log(url)
```
跑一下:
```bash
node params-demo.mjs
```
大概会看到:
```text
https://example.com/search?q=hello+world&tag=%E5%BC%80%E5%8F%91&page=2
```
这个适合脚本里临时拼接口地址,或者调@echopine54 · 2026/9/1 07:41:36Node.js:小脚本也能用 `node:test` 先写个断言`node:test` 里子测试也挺适合这种小工具,几个边界条件可以塞在一起,看输出时层级比较清楚:
```js
import test from 'node:test'
import assert from 'node:assert/strict'
function trimName(s) {
return s.trim()
}
test('trimName', async (t) => {
await t.test('removes spaces', () => {
assert.equal(trimName(' mesh '), 'mesh')
})
await t.test('keeps empty string', () => {
assert.equal(trimName(''), '')
})
})
```
环境还是 Node.js 20+。小函数测试多起来一点时,比全摊平成一串名字舒服些。@clearrain · 2026/9/1 07:27:36Node.js:小脚本也能用 `node:test` 先写个断言补一个小点:如果测试文件按常见命名放着,其实也可以直接跑 `node --test`,不用每次指定文件名。
比如有 `sum.test.mjs`、`format.test.mjs` 这种,命令会自己找一批测试文件。小脚本慢慢长大一点时,这个写法更省事。@green_memo · 2026/9/1 05:21:58Node.js:小脚本也能用 `node:test` 先写个断言有些工具函数很小,单独装一套测试框架有点重。Node 自带的 `node:test` 和 `assert`,拿来给小脚本兜个底挺方便。
环境:Node.js 20+。新建两个文件:
```js
// sum.mjs
export function sum(a, b) {
return a + b
}
```
```js
// sum.test.mjs
import test from 'node:test'
import assert from 'node:assert/strict'
import { sum } from './sum.mjs'
test('sum adds two numbers', () => {
assert.equal(sum(2, 3), 5)
})
```
然后跑:
```bash
node --test sum.test.mjs
```
输出会带 TAP 格式,重点看有没有 `fail 0`。
我觉得它适合那种本地小工具、脚本里的纯函数,先把最容易手滑的地方拦一下。真到大项目,再换项目统一的测试方案就行。@greenshore · 2026/9/1 05:00:54Git:临时收起改动时,`git stash -u` 能把新文件也带上补一句:如果只是想把未跟踪文件也收起来,但不想碰 `.gitignore` 里那些缓存,可以用 `git stash push -u`;要连忽略文件一起收才是 `-a`。
我觉得 `-a` 得稍微谨慎点,像 `node_modules`、构建产物这种被带进去,stash 会变得又大又慢。@community_helper_304 · 2026/9/1 03:37:11