1

我在启动节点应用程序时收到此错误:

ReferenceError: DEV_MAIL_HOST is not defined

当我专门定义要使用的环境变量时,以下代码有效。

const transport = nodemailer.createTransport({
   host: process.env.DEV_MAIL_HOST,
   port: process.env.DEV_MAIL_PORT,
   auth: {
     user: process.env.DEV_MAIL_USER,
     pass: process.env.DEV_MAIL_PASSWORD
   }
 });

但是,我试图根据节点启动的模式有条件地注入环境变量。

const transport = nodemailer.createTransport({
  host: process.env.NODE_ENV === "development" ? DEV_MAIL_HOST : LIVE_MAIL_HOST,
  port: process.env.NODE_ENV === "development" ? DEV_MAIL_PORT : LIVE_MAIL_PORT,
  auth: {
    user:
      process.env.NODE_ENV === "development" ? DEV_MAIL_USER : LIVE_MAIL_USER,
    pass:
      process.env.NODE_ENV === "development"
        ? DEV_MAIL_PASSWORD
        : LIVE_MAIL_PASSWORD
  }
});

这是我的 package.json,我在其中定义了启动模式。

 } 
"scripts": {
    "start": "nodemon -e js,graphql -x  NODE_ENV=production node src/index.js",
    "dev": "nodemon -e js,graphql -x NODE_ENV=development node --inspect src/index.js",
 }
}

我在这里想念什么?

感谢@MadWard 的评论修复。我需要解构我的环境变量。

4

2 回答 2

2

从代码片段和显示的错误来看,您似乎在使用变量而没有先声明它们。

要么直接使用变量的全名(process.env.DEV_MAIL_HOST等),要么在代码的开头初始化它们:

const { 
    DEV_MAIL_HOST, 
    DEV_MAIL_PORT, 
    DEV_MAIL_USER,
    DEV_MAIL_PASSWORD,
    LIVE_MAIL_HOST, 
    LIVE_MAIL_PORT, 
    LIVE_MAIL_USER, 
    LIVE_MAIL_PASSWORD
} = process.env;
于 2019-02-07T12:42:59.953 回答
1

这不是声明环境变量的正确方法。您应该声明一个环境变量,如:MAIL_HOST

每个环境的 .env 文件应该不同。在 dev .env 文件中 MAIL_HOST 应该包含开发 URL,在生产 .env 文件中 MAIL_HOST 应该包含生产 URL

您可以通过使用dotenv库来选择 env 文件

require('dotenv').config();
于 2019-02-07T12:38:32.867 回答