症状
服务端 fetch 抛出 TypeError: Failed to parse URL from /api/users,而同一代码在浏览器中可运行。浏览器会把相对路径按页面 origin 解析,Node 却没有文档 origin,因此单独一个路径不是合法 URL。这是把前端习惯搬到服务端,且常常隐藏在只含路径的 base URL 之下。
诊断
用最小示例确认相对 URL 被拒;用 new URL(path, base) 验证可解析;检查环境配置里是否只有路径没有 scheme 与 host。
node -e "fetch('/api').catch(e=>console.log(e.constructor.name, e.message))"
根因
Node 的 fetch 需要绝对 URL,因为没有文档可用于解析相对路径。传入 /api 之类路径是浏览器假设,在服务端不成立。
修复
用 URL 构造函数把路径基于配置的 origin 解析为绝对 URL,并让 base URL 包含 scheme 与 host。把它集中在单个 HTTP 辅助函数中,避免各调用点重复犯错。
验证
重发请求确认到达预期主机,并在日志或客户端确认解析后的 URL 正确。绝对 URL 正确且响应成功即证明修复。
常见陷阱
在 base URL 缺失时静默拼接字符串容易产生畸形 URL;应始终用 URL 构造函数而非手写拼接。