我正在尝试使用他们的 nodejs 包通过 Drizzle 连接 postgresql 数据库与 SvelteKit。我在将数据库环境变量导入 Drizzle 配置时遇到问题。
起初,我以为我可以通过 SvelteKit 文档使用 SvelteKit 的内置模块($env/static/private):Module Docs 和 Environment Variable Tutorial
我第一次尝试的毛毛雨配置如下所示:
毛毛雨.config.ts:
import { defineConfig } from 'drizzle-kit';
import { env } from '$env/static/public';
export default defineConfig({
schema: './src/lib/server/schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {
host: env.DB_HOST,
port: env.DB_PORT,
user: env.DB_USER,
password: env.DB_PASSWORD,
database: env.DB_NAME,
},
});
但是这个实现给了我以下错误:
_Cannot find module '$env/static/private' or its corresponding type declarations._
。我研究了这个错误,发现以下 Stack Overflow 问题解决了这个问题:How to useenvironmentvariables in root files of you SvelteKit project?
据我了解,因为Drizzle配置位于根目录中,所以它是在SvelteKit处理它之前由Vite处理的?因此,要么您必须将 Drizzle 配置移动到 SvelteKit 中的嵌套文件夹(这是一个示例,除了它使用 Planetscale 包而不是直接集成),或者您必须直接使用
process.env
,尽管 $env/static/private
具有访问权限到 process.env
变量(这是此方法的一个示例,不幸的是又过时了)。 这也是教程中的另一个示例,似乎暗示您可以在 root 中进行 Drizzle 配置,同时也使用 $env/static/private
,但另一个堆栈溢出问题似乎与此相矛盾,并且此示例也使用旧版本Drizzle 配置语法。
我遇到的问题实际上是实施
process.env
。
我需要导入 dotenv (我的印象是 Svelte 已经包含它,但我不确定是否需要显式调用它)?如何确保 Typescript 能够识别环境变量的类型?最佳实践是使用 process.env 或带有数据库的嵌套文件夹格式(我引用的另一个 Stack Overflow 问题说,如果我使用嵌套文件夹方法,那么我将无法使用像 drizzle-kit 这样的 Drizzle 工具.),或者真的有办法在根目录中使用
$env/static/private
和配置文件吗?
我尝试使用此堆栈溢出问题来遵循 Node 的 process.env 的更通用示例,但我很困惑。这是我最近的尝试(仍然使用根目录中的文件),这给了我各种错误:
import { defineConfig } from 'drizzle-kit';
declare var process : {
env: {
DB_HOST: string,
DB_PORT: string,
DB_USER: string,
DB_PASSWORD: string,
DB_NAME: string
}
}
export default defineConfig({
schema: './src/lib/server/schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
},
});
在 SvelteKit 中使用环境变量的最佳实践是什么,如何实现?
当我第 100 次阅读示例后发现,我没有意识到在 sveltekit 中必须在 static .env(在项目根目录中)中的变量前面加上 PUBLIC_ 和 PRIVATE_ 时,我简直不敢相信。
其他任何东西都没有被注入,并且显然没有其他方法(vite、node)至少可以开箱即用。
因此您可以使用 .env 文件来存储 url 或凭据,然后
import { SECRET_DATABASE_URL } from '$env/static/private';
就最佳实践而言,显然将敏感信息存储在 .env 中是更好的方法。如果您使用 git,请确保 .env 位于 .gitignore 中(sveltekit 自动为我完成了此操作)。
我不认为如果文件位于根目录上,这个魔法就不可用,特别是因为您在某个时候导入它来进行查询,但我的数据库配置/实例化位于 $lib 中。我使用了 knex,但过程看起来很相似。