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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:29:51