You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SvelteKit使用WebSocket连接FastAPI报错未定义如何解决?

问题原因

SvelteKit 默认开启服务端渲染(SSR),你的代码会先在 Node.js 服务端环境执行一遍,而 Node.js 原生没有浏览器端的 WebSocket API,因此触发未定义报错。

修复方案

方案1:使用 onMount 生命周期(最推荐)

onMount 是 Svelte 专属生命周期,只会在代码加载到浏览器客户端后执行,完全规避服务端执行逻辑。
代码修改如下:

<script>
import { onMount } from 'svelte'

let socket
onMount(() => {
    socket = new WebSocket("ws://localhost:8000/chat")
    socket.addEventListener("open", ()=> {
        console.log("Opened")
    })
    
    // 可选:组件销毁时关闭WebSocket连接,避免内存泄漏
    return () => socket.close()
})
</script>

方案2:判断浏览器环境再执行

如果你需要在其他时机而非组件挂载时初始化连接,可以通过 SvelteKit 提供的 browser 变量判断当前运行环境:

<script>
import { browser } from '$app/environment'

let socket
if (browser) {
    socket = new WebSocket("ws://localhost:8000/chat")
    socket.addEventListener("open", ()=> {
        console.log("Opened")
    })
}
</script>

方案3:禁用当前页面的SSR

如果当前页面没有SEO需求、全是客户端专属逻辑,可以直接关闭页面的服务端渲染,一劳永逸解决所有浏览器API不存在的问题。
在同目录下的 +page.js(没有就新建一个)添加如下代码:

export const ssr = false

配置完成后你的原有代码无需修改即可正常运行。

内容的提问来源于stack exchange,提问作者yawad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:48:02