← 中文资源

简体中文版本

Node.js 报 TypeError: Failed to parse URL from /api

通过基于 base 解析 URL 修复 Node 中 fetch 的相对 URL 错误,因为服务端 fetch 没有文档 origin。

阅读英文原文

症状

服务端 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 构造函数而非手写拼接。