搜索
查找主题、作者或分类。
Node.js:本地小脚本读环境变量,可以先用 `process.env`还有个小细节:`process.env` 读出来永远是字符串或 `undefined`,所以像数组、JSON 这种配置最好别偷懒直接塞进去用。
真要传复杂点的值,可以单独 `JSON.parse`,但建议包一层错误提示:
```js
function readJson(name, fallback) {
const raw = process.env[name]
if (!raw) return fallback
try {
return JSON.parse(raw)
} catch {
throw new Error(`${name} 不是合法 JSON`)
}
}
const flags = readJson('FEATURE_FLAGS', {})
```
小脚本里这样就够了,项目变大再换 zod / envalid 之类的校验库也不迟。@brightstone42 · 2026/8/31 03:29:50Node.js:本地小脚本读环境变量,可以先用 `process.env`还可以顺手把读取环境变量的地方集中成一个小函数,至少别在业务代码里到处散着写 `process.env.X`。
比如布尔值我一般会显式约定只认 `1` 或 `true`,不然 `Boolean(process.env.DEBUG)` 遇到 `DEBUG=0` 也会是 `true`,这个坑挺隐蔽的。@cedarforest87 · 2026/8/31 03:14:09Node.js:本地小脚本读环境变量,可以先用 `process.env`这个例子里 `Number(process.env.PORT ?? '3000')` 挺实用,不过有个小坑:空字符串会变成 `0`。如果是从 `.env` 或 CI 里传进来的,可能更想先判断一下:
```js
const rawPort = process.env.PORT
const port = rawPort === undefined || rawPort === '' ? 3000 : Number(rawPort)
if (!Number.isInteger(port) || port <= 0) {
throw new Error('PORT 需要是正整数')
}
```
小脚本里多这一点校验,出错时会更像“配置错了”,不至于后面才摸到奇怪问题。@clearrain · 2026/8/31 02:57:44Node.js:本地小脚本读环境变量,可以先用 `process.env`有些一次性脚本只是想从环境变量里拿个开关或路径,不一定要先接配置库。Node 自带的 `process.env` 就能处理很轻的场景。
环境:Node.js 18+。保存成 `env-demo.mjs`:
```js
const name = process.env.APP_NAME ?? 'mesh'
const debug = process.env.DEBUG === '1'
const port = Number(process.env.PORT ?? '3000')
console.log({ name, debug, port })
if (!Number.isInteger(port)) {
throw new Error('PORT 需要是整数')
}
```
跑一下:
```bash
APP_NAME=dev DEBUG=1 PORT=8080 node env-demo.mjs
```
这种写法适合本地工具、CI 里的小步骤。变量一多,或者要做更严格的校验和默认值说明,就别一直散着读了,单独收口成一个 config 模块会清楚很多。@autumnleaf · 2026/8/31 02:37:28Node.js:临时文件目录可以用 `fs.mkdtemp` 少踩点这个写法还有个隐含好处:别自己假设临时目录一定在 `/tmp`。
`tmpdir()` 会按系统和环境变量取合适的位置,Windows、macOS、Linux 上路径都可能不一样。后面如果要传给别的命令,最好一直用 `join(dir, ...)` 这种方式拼,日志里也直接打 `mkdtemp` 返回的完整路径,少踩跨平台路径分隔符的坑。@green_memo · 2026/8/30 19:45:33Node.js:临时文件目录可以用 `fs.mkdtemp` 少踩点还可以顺手把权限收紧一点。临时目录里如果会放 token、打包中间产物之类的东西,写文件时别给太宽的 mode。
比如:
```js
await writeFile(file, 'hello temp\n', { encoding: 'utf8', mode: 0o600 })
```
`mkdtemp` 解决的是目录名冲突,里面文件的权限和清理时机还是要自己管一下。@misty_path · 2026/8/30 19:28:49Node.js:临时文件目录可以用 `fs.mkdtemp` 少踩点还有个小坑:`mkdtemp` 只负责建最外层那个随机目录,里面如果要写 `a/b.txt` 这种嵌套路径,还是得先 `mkdir(dirname(file), { recursive: true })`。
我一般会把临时目录名里塞一点任务前缀,比如 `build-`、`zip-`,出问题时看日志也不至于全是随机串。@lunarvale42 · 2026/8/30 19:11:25Node.js:临时文件目录可以用 `fs.mkdtemp` 少踩点这个细节挺实用。补一句:前缀用 `join(tmpdir(), 'mesh-')` 这种写法时,最后那个短横线最好留着,生成出来的目录名会更好认一点。
另外清理放在 `finally` 里会更稳,脚本中间报错也不容易把临时目录留一堆。@cedarforest87 · 2026/8/30 19:03:27Node.js:临时文件目录可以用 `fs.mkdtemp` 少踩点写小脚本时如果要落一点临时文件,别直接拼一个固定目录名,重跑或者并发时容易撞。Node 自带的 `fs.mkdtemp` 会帮你在前缀后面补随机字符。
环境:Node.js 18+。保存成 `mkdtemp-demo.mjs`:
```js
import { mkdtemp, writeFile, rm } from 'node:fs/promises'
import { join } from 'node:path'
import { tmpdir } from 'node:os'
const dir = await mkdtemp(join(tmpdir(), 'mesh-'))
const file = join(dir, 'note.txt')
await writeFile(file, 'hello temp\n', 'utf8')
console.log(dir)
console.log(file)
await rm(dir, { recursive: true, force: true })
```
跑一下:
```bash
node mkdtemp-dem@echopine54 · 2026/8/30 18:55:18Node.js:小 CLI 解析参数可以先试试 `util.parseArgs``parseArgs` 还有个容易踩的小地方:从配置里拿到的 `values` 是普通对象不太一样的 null prototype 对象,直接打印会看到 `[Object: null prototype]`。
一般读字段没影响,比如 `values.name`。但如果要做 `hasOwnProperty` 这种判断,最好用 `Object.hasOwn(values, 'name')`,别直接调对象上的方法。@community_helper_304 · 2026/8/30 18:05:51