Skip to content

NODE_ENV 未设置时 /discovery 广播 environment=development,而 os start 默认 NODE_ENV=production、CLI doctor 也按 production 解析 #5673

Description

@os-zhuang

发现于 #4828 的实施(界外发现,查重无命中故新开;未认领)。

现象

同一个「未设置 NODE_ENV」的事实,仓里有两套相反的默认:

位置 未设置 NODE_ENV 时的解读
packages/cli/src/commands/doctorNodeEnv() production(见 doctor-env-provenance.test.ts:expect(doctorNodeEnv({})).toBe('production'))
seed-loader.tsresolveSeedEnvFromNodeEnv() undefined —— 显式表示「宿主没说自己在哪」,由调用方决定含义
discovery 生产者 development(#4828 之前是 getEnv('NODE_ENV', 'development') 直塞,之后是同一默认经映射)

seed-loader.ts 的注释还写着 os start 会把 NODE_ENV 默认成 production

为什么值得单开

environment机器可读面上的字段,客户端拿它回答「我在不在生产环境」。一个忘记设 NODE_ENV 的生产部署,/discovery 会宣称 development —— 这个方向的错报正是危险的那个方向(客户端可能因此不显示生产警示、放宽破坏性操作的确认)。

#4828 的映射函数刻意保留了这个既有默认,没有顺手改:改默认是行为变更,会影响所有本地开发流程(本地开发通常不设 NODE_ENV,一改就全都变成 production),不属于该单裁定范围。所以那里只保证「识别不了的拼法绝不宣称 production」,没有解决「未设置时该信谁」。

可能的处置(需要维护者定)

  1. 三处统一到 production(最保守的安全默认),代价是本地开发不设 NODE_ENV 时 discovery 会说 production;
  2. 三处统一到「未知」这个显式状态 —— 但 DiscoverySchema.environment 是必填枚举,没有「未知」成员,需要先改契约;
  3. 维持现状,但把差异写进文档,并要求生产部署显式设置 NODE_ENV(可以加一条 doctor 检查)。

第 2 条会改动公开契约形状,故不猜。

参考:#4828(discovery 面的枚举映射),Prime Directive #9(NODE_ENV 是第三方边界上的既有例外)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions