SvelteKit导入$lib/server/db.ts至客户端代码报错问题咨询
问题原因与解决方案
你的配置核心问题出在lib/server/db.ts里的顶级await——在模块顶层直接执行await client.connect(),会导致Vite在模块处理过程中,误将这个服务器端模块的加载逻辑牵连到客户端上下文,从而触发Cannot import $lib/server/db.ts into client-side code错误。
虽然最终能输出结果,但这个错误是模块加载时机的异常导致的,需要修正数据库连接的初始化逻辑:
修正后的lib/server/db.ts代码
import { Client } from 'pg'; // 缓存数据库连接实例,避免重复建立连接 let clientInstance; // 封装连接初始化逻辑,确保只执行一次 async function getDbClient() { if (!clientInstance) { clientInstance = new Client({ database: 'todos' }); await clientInstance.connect(); } return clientInstance; } export async function getList() { const client = await getDbClient(); return await client.query('select * from items'); }
为什么这样改?
- 去掉了模块顶层的await,将连接初始化延迟到第一次调用
getList时执行 - 通过缓存
clientInstance,避免每次请求都重新建立数据库连接,提升性能 - 确保所有数据库操作的逻辑都在服务器端安全执行,不会被客户端代码触发
这样修改后,终端和浏览器的错误提示就会消失,同时数据库查询功能保持正常。
内容的提问来源于stack exchange,提问作者RobKohr
相关产品推荐
相关产品推荐

