如何在SvelteKit/Node.js项目中集成MySQL数据库
问题核心原因
- 导入语法错误:你使用的
mysql包是CommonJS默认导出,采用具名导入import { mysql } from 'mysql'无法匹配导出对象,正确的ESModule导入写法为import mysql from 'mysql'或者import * as mysql from 'mysql'。 - 执行环境错误:
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完全兼容。
- 安装依赖
npm install mysql2
- 服务端查询示例(以
+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 } }
- 页面层接收数据
<!-- src/routes/+page.svelte --> <script> export let data </script> <p>查询结果:{data.solution}</p>
注意事项
- 绝对不要在非服务端专属文件中写数据库连接逻辑,否则会将数据库账号密码泄露到客户端,也会触发浏览器环境不兼容报错
- 生产环境不要硬编码数据库配置,全部放在项目根目录的
.env文件中,用SvelteKit内置的私有环境变量读取,这类变量仅服务端可访问,不会泄露到客户端 - 如果你坚持使用旧的
mysql包,遇到ESModule兼容问题可以尝试调用mysql.default下的方法,不过还是建议直接替换为mysql2,不需要额外修改业务逻辑。
内容的提问来源于stack exchange,提问作者Total Noob
相关产品推荐
相关产品推荐

