Solid Start中createEffect未执行问题排查
问题分析与解决
核心原因
你遇到的问题大概率是**直接在浏览器客户端代码中使用Node.js的PostgreSQL连接库(pg)**导致的:
pg库依赖Node.js底层网络API(比如net模块),这些API在浏览器环境中不存在,初始化连接池时就会抛出错误,导致后续代码(包括console.log("Running"))完全无法执行。- 你单独调用
getName(1)能成功,是因为这个调用是在Node.js环境(比如后端脚本)中执行的,而组件代码是在浏览器里运行的,环境不兼容。
另外还有两个小问题:
await console.log(...)完全多余,console.log是同步函数,不需要加await- 异步函数没有错误捕获,一旦出错会静默失败,无法排查问题
解决方案
1. 前后端分离方案(推荐)
把数据库查询逻辑移到后端API,前端通过HTTP请求获取数据:
- 后端写一个接口(比如
/api/user/1),在接口里调用getName函数查询数据库并返回结果 - 前端组件里用
fetch调用这个接口:
import { createEffect, createSignal } from 'solid-js'; export default function Myperson() { const [name, setName] = createSignal('Loading...') createEffect(() => { const fetchName = async () => { console.log("Running") try { const res = await fetch('/api/user/1'); const data = await res.json(); setName(data.first_name); } catch (err) { console.error("获取数据失败:", err); setName("加载失败"); } }; fetchName(); }); return ( <div> {name()} </div> ); }
2. 服务端渲染场景(如SolidStart)
如果用的是SolidStart这类支持服务端执行的框架,可通过框架提供的服务端函数处理数据库查询,比如server$:
import { createEffect, createSignal } from 'solid-js'; import { server$ } from 'solid-start/server'; // 该函数仅在服务器端执行 const getName = server$(async (id: number) => { // 这里放置原有的Kysely数据库查询代码 const x = await db.selectFrom('person').selectAll().where("id" , "=" , id).execute(); return x[0].first_name; }); export default function Myperson() { const [name, setName] = createSignal('Loading...') createEffect(() => { const fetchName = async () => { console.log("Running") try { const nameResult = await getName(1); setName(nameResult); } catch (err) { console.error("获取数据失败:", err); setName("加载失败"); } }; fetchName(); }); return ( <div> {name()} </div> ); }
3. 临时排查:添加错误捕获
给异步函数加上try/catch,查看具体报错信息:
createEffect(() => { (async () => { try { console.log("Running") const nameResult = await getName(1); setName(nameResult); } catch (err) { console.error("错误信息:", err); } })(); });
打开浏览器控制台就能看到具体错误,确认是否为环境不兼容问题。
内容的提问来源于stack exchange,提问作者pcp pcp
相关产品推荐
相关产品推荐

