如何在 SvelteKit 中使用 process.env?

问题描述 投票:0回答:1

我正在尝试使用他们的 nodejs 包通过 Drizzle 连接 postgresql 数据库与 SvelteKit。我在将数据库环境变量导入 Drizzle 配置时遇到问题。

起初,我以为我可以通过 SvelteKit 文档使用 SvelteKit 的内置模块($env/static/private):Module DocsEnvironment 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 中使用环境变量的最佳实践是什么,如何实现?

node.js postgresql environment-variables sveltekit drizzle-orm
1个回答
0
投票

当我第 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,但过程看起来很相似。

© www.soinside.com 2019 - 2024. All rights reserved.