如何在Playwright中使用SvelteKit的$lib与$env别名?
解决Playwright中使用DrizzleORM数据库实例的
$env导入错误 问题根源
Playwright运行在Node.js环境中,不识别SvelteKit内置的$env模块别名;你配置的tsconfig.json路径别名仅作用于TypeScript编译阶段,无法在运行时让Node解析$env导入。
解决方案
方案1:修改数据库连接文件,兼容测试环境
调整src/lib/server/db.ts的代码,根据环境切换配置来源:
import { connect } from "@planetscale/database"; import { drizzle } from "drizzle-orm/planetscale-serverless"; // 优先从Node环境变量读取,适配Playwright测试场景 const DB_HOST = process.env.DB_HOST || (await import("$env/static/private")).DB_HOST; const DB_PASSWORD = process.env.DB_PASSWORD || (await import("$env/static/private")).DB_PASSWORD; const DB_USERNAME = process.env.DB_USERNAME || (await import("$env/static/private")).DB_USERNAME; const connection = connect({ host: DB_HOST, username: DB_USERNAME, password: DB_PASSWORD, }); export const db = drizzle(connection);
然后在Playwright配置文件(playwright.config.ts)中加载测试用环境变量:
import { defineConfig, devices } from '@playwright/test'; import dotenv from 'dotenv'; // 加载测试专属的环境变量文件 dotenv.config({ path: './tests/.env' }); export default defineConfig({ // 其他Playwright配置项... });
在tests/.env中填入测试数据库的配置:
DB_HOST=你的测试数据库地址 DB_PASSWORD=你的测试数据库密码 DB_USERNAME=你的测试数据库用户名
方案2:创建测试专用的数据库实例
直接在测试目录下新建独立的数据库连接文件(比如tests/e2e/utils/db.ts),完全避开SvelteKit的$env依赖:
import { connect } from "@planetscale/database"; import { drizzle } from "drizzle-orm/planetscale-serverless"; const connection = connect({ host: process.env.DB_HOST, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, }); export const testDb = drizzle(connection);
同样在Playwright配置中加载tests/.env,测试代码里直接导入这个testDb即可使用。
补充说明:为什么之前的tsconfig配置无效?
tsconfig.json的paths配置仅用于TypeScript编译器的类型检查和代码编译,不会修改Node.js运行时的模块解析逻辑。Playwright运行时依赖Node原生模块系统,它无法识别$env这个自定义别名,因此必须通过环境变量或代码逻辑调整来解决。
内容的提问来源于stack exchange,提问作者Sowdowdow
相关产品推荐
相关产品推荐

