如何在SvelteKit的endpoint中获取当前服务的hostname?
解决方案
你所用的这类全栈框架(从export async function get的写法判断大概率是SvelteKit)的服务端API路由入参中,除了params还包含当前请求的URL信息,直接提取即可替换硬编码地址。
代码修改示例
// 解构入参新增url字段 export async function get({ params, url }) { // url.origin 就是当前服务的完整前缀:协议+域名+端口 const baseApiPrefix = `${url.origin}/api/visits/` let sortedByDate = loadStays().sort((a, b) => { return b.datedebpassage - a.datedebpassage }); await Promise.all(sortedByDate.map(async (stay) => { const res = await fetch(baseApiPrefix + stay.visitId); if (res.ok) { stay.visits = await res.json(); } else { stay.visits = []; } })); return { body: sortedByDate, }; }
其他框架适配方案
如果是Express/Koa类的传统Node框架,可以从请求头拼接地址:
// Express场景示例 const baseUrl = `${req.protocol}://${req.get('host')}`
注意事项
- 如果服务部署在Nginx、Vercel等反向代理后,需要提前配置框架的「信任代理」参数,否则获取到的host会是内部代理地址,而非对外的真实域名:
- Express 配置:
app.set('trust proxy', true) - SvelteKit 配置:在
svelte.config.js的adapter配置中开启信任代理
- Express 配置:
额外优化建议
如果要请求的内部API和当前endpoint属于同一个服务,你完全可以直接导入对应API的处理函数直接调用,省去HTTP请求的网络开销,性能更好。
内容的提问来源于stack exchange,提问作者Guitool
相关产品推荐
相关产品推荐

