症状
调用 fetch('/api/users') 或 new URL(host) 时抛出 TypeError [ERR_INVALID_URL]。这些值看似合法,直到你检查其字节构成才发现问题。在浏览器里同样的相对字符串能工作,因为页面提供了 base,这正是该错误在服务端令人意外的原因。
诊断
用转义方式打印原始值,让空白字符无所遁形:
console.log(JSON.stringify(input));
再测试提供 base 后是否能解析:
new URL('/api/users', 'https://api.example.com'); // works
new URL('/api/users'); // throws
修复
始终基于 base 构造 URL,并对动态片段做编码:
const base = process.env.API_BASE || 'https://api.example.com';
const url = new URL(`/users/${encodeURIComponent(id)}`, base);
await fetch(url);
在启动时校验 API_BASE,使其缺失协议时尽早失败。
验证
在每次请求前打印解析后的 url.href,确认请求能到达服务端,且不再出现无效 URL 错误。