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

如何在SvelteKit/Node.js项目中集成MySQL数据库

问题核心原因

  1. 导入语法错误:你使用的mysql包是CommonJS默认导出,采用具名导入import { mysql } from 'mysql'无法匹配导出对象,正确的ESModule导入写法为import mysql from 'mysql'或者import * as mysql from 'mysql'。
  2. 执行环境错误:mysql是仅Node.js环境可用的包,无法在浏览器客户端运行。SvelteKit的代码默认会同时编译服务端、客户端两个版本,如果你把数据库连接逻辑写在了普通+page.svelte、+page.js这类不带.server后缀的文件中,代码会被打包到客户端,运行时自然报错。

正确操作步骤

所有数据库相关逻辑必须写在SvelteKit的服务端专属文件中,也就是文件名带.server后缀的文件:+page.server.js/ts、+layout.server.js/ts、+server.js/ts,这类文件只会在服务端执行,不会暴露给客户端。

更推荐使用维护更活跃、原生支持ESModule和async/await的mysql2包替代旧的mysql包,适配性更强,API和旧版mysql完全兼容。

  1. 安装依赖
npm install mysql2
  1. 服务端查询示例(以+page.server.js为例)
// src/routes/+page.server.js
import mysql from 'mysql2/promise'
// 数据库配置建议存在.env文件,通过SvelteKit内置私有环境变量读取
import { MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB } from '$env/static/private'

export async function load() {
  // 推荐用连接池,性能优于单次创建连接
  const connectionPool = mysql.createPool({
    host: MYSQL_HOST,
    user: MYSQL_USER,
    password: MYSQL_PWD,
    database: MYSQL_DB,
    connectionLimit: 10
  })

  const [queryResult] = await connectionPool.query('SELECT 1 + 1 AS solution')
  // 关闭连接池
  await connectionPool.end()

  return {
    solution: queryResult[0].solution
  }
}
  1. 页面层接收数据
<!-- src/routes/+page.svelte -->
<script>
  export let data
</script>

<p>查询结果:{data.solution}</p>

注意事项

  • 绝对不要在非服务端专属文件中写数据库连接逻辑,否则会将数据库账号密码泄露到客户端,也会触发浏览器环境不兼容报错
  • 生产环境不要硬编码数据库配置,全部放在项目根目录的.env文件中,用SvelteKit内置的私有环境变量读取,这类变量仅服务端可访问,不会泄露到客户端
  • 如果你坚持使用旧的mysql包,遇到ESModule兼容问题可以尝试调用mysql.default下的方法,不过还是建议直接替换为mysql2,不需要额外修改业务逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:05