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

NextJS中使用sql.js报TypeError: Cannot set properties of undefined错误

解决Next.js Server Actions中使用sql.js的模块兼容问题

问题根源

sql.js默认分发版本为浏览器环境设计,依赖浏览器模块系统,而Next.js Server Actions运行在Node.js环境中,直接导入会触发模块系统冲突,导致Cannot set properties of undefined (setting 'exports')错误。

解决方向

1. 使用sql.js的Node.js专用导入路径

sql.js提供了Node.js环境的入口,导入该路径可避免模块冲突:

'use server';

// 导入Node.js版本的sql.js
import initSqlJs from 'sql.js/dist/sql-wasm.node.js';
import path from 'path';
import { fileURLToPath } from 'url';

export const initDb = async () => {
  try {
    // Node.js环境下需指定Wasm文件路径
    const __dirname = path.dirname(fileURLToPath(import.meta.url));
    const SQL = await initSqlJs({
      locateFile: filename => path.join(__dirname, 'node_modules/sql.js/dist', filename)
    });
    const db = new SQL.Database();
    console.log('数据库初始化成功:', db);
    // 返回状态给客户端
    return { success: true, message: '数据库初始化完成' };
  } catch (error) {
    console.error('数据库初始化失败:', error);
    return { success: false, error: error.message };
  }
};

2. 调整客户端调用逻辑

客户端调用Server Action时,建议用async/await处理异步逻辑,确保正确接收返回值:

// 客户端组件中
import { initDb } from '@/app/actions';

async function handleInitDb() {
  const result = await initDb();
  console.log('Server Action返回结果:', result);
}

// 组件内触发调用示例
<button onClick={handleInitDb}>初始化数据库</button>

3. 验证Wasm文件路径

若仍出现Wasm加载问题,检查node_modules/sql.js/dist目录下是否存在sql-wasm.wasm文件,调整locateFile的返回路径确保指向正确位置。

4. 备选方案:改用原生Node.js SQL库

如果sql.js的Node.js适配仍有问题,可替换为原生支持Node.js的库,比如better-sqlite3:

'use server';

import Database from 'better-sqlite3';

export const initDb = () => {
  try {
    const db = new Database(':memory:'); // 内存数据库,也可指定本地文件路径
    console.log('数据库初始化成功:', db);
    return { success: true };
  } catch (error) {
    console.error('初始化失败:', error);
    return { success: false, error: error.message };
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:43:24