AstroJS - 未定义带有 dotenv 包的 process.env 的进程

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

我尝试从 .env 文件加载一个秘密,该文件是条带可发布密钥

import * as dotenv from 'dotenv'
dotenv.config()

导入此文件时出现错误:

Uncaught (in promise) ReferenceError: process is not defined

我目前正在使用 astrojs 框架,我一直在使用

import.meta.env
,但这似乎在生产构建中不起作用,我在 docker-compose 文件中设置了键值,但看不到该值。是
undefined
。使用 docker-compose 和
import.meta.env
解决或解决 dotenv 都可以。如果我们存储条带可发布密钥,什么最适合?

javascript reactjs stripe-payments production-environment astrojs
2个回答
0
投票

这实际上取决于您在生产中运行代码的方式。如果您在节点环境中使用服务器端渲染运行代码,则可以使用 process.env

如果您有疑问,请查看文件 astro.config.mjs

这是来自文档的使用节点适配器和服务器端渲染的示例:

import { defineConfig } from 'astro/config';
import node from '@astrojs/node';

export default defineConfig({
  output: 'server',
  adapter: node({
    mode: 'standalone'
  }),
});

如果您的 astro.config.mjs 看起来像这样,您可能会通过以下方式获取环境变量:

const value = import.meta.env.PUBLIC_VALUE ?? process.env.PUBLIC_VALUE

上述策略优先通过 import.meta.env 获取值(如果设置)。但如果未定义,则使用 process.env。

对我来说,这个策略在本地运行代码和通过 docker 运行代码时都有效。

变量名称以

PUBLIC_
开头很重要,这是因为只有
PUBLIC_
变量在服务器端可用,如此处

所述

0
投票

要在

astro.config.mjs
中使用环境变量,您可以使用以下方法:

import { loadEnv } from "vite";

// Load the environment variables
const { MY_ENV } = loadEnv(import.meta.env.MODE, process.cwd(), "");

// Export the Astro configuration
export default defineConfig({
  site: 'https://www.example.com',
  integrations: [
    mdx(), 
    sitemap(), 
    react(),
    ...(MY_ENV === "true" ? [plugin()] : []) // Conditionally add the plugin based on MY_ENV
  ],
});

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