无法使用 process.env 变量连接到数据库,但 process.env vars 在日志中打印

Posted

技术标签:

【中文标题】无法使用 process.env 变量连接到数据库,但 process.env vars 在日志中打印【英文标题】:Can't connect to database with process.env variables but process.env vars print in log 【发布时间】:2018-11-02 20:26:55 【问题描述】:

我正在使用 Node/express 连接到 redshift 数据库。我将要连接到数据库的变量放在 .env 文件中,在我的本地机器上,我可以连接到 localhost 上的网站。

但是,当我将文件上传到服务器并更改 clientConfiguration 时,它不再起作用,即使我将 require('dotenv').config(path: ) 更改为正确的路径。我很确定路径是正确的,因为 process.env.HOST 将打印在日志中。

将出现此错误:用户“root”的密码验证失败

这是有效的硬编码部分。

var clientConfiguration = 
   user: "user",
   database: "database",
   password: "password",
   port: 1234,
   host: "hosturl.com",
;

当我换上这部分时,它不再起作用了。

 var clientConfiguration = 
   user: process.env.USER,
   database: process.env.DATABASE,
   password: process.env.PASSWORD,
   port: process.env.PORT,
   host: process.env.HOST,
 ;

我认为这是因为 process.env 变量作为字符串被读入,但即使在我使用 parseInt(process.env.PORT) 之后也没有帮助——我也不需要本地机器上的 parseInt ,所以我不明白

【问题讨论】:

变量中的值是否包含引号?如果没有,也许您需要在变量周围添加引号? 我的所有字符串都有引号,但其中一些(一个或另一个)有双引号和单引号...... 【参考方案1】:

您是否尽早致电dotenv.config()?我在创建一个新的 Express 实例后立即调用它,它通常可以工作。

另外,不确定这是否是“可接受的方式”,但我之前遇到过类似的问题,发现在我启动服务器的 IIFE 内进行异步 dotenv.config() 调用解决了这个问题:

//AWAIT DB CONNECTION BEFORE STARTING SERVER
(async function () 
  try 
    await dotenv.config();
    await connectDB();
    app.listen(PORT, ()=> 
      console.log(`Server listening in $MODE mode on $PORT`);
    );
   catch (err) 
    console.log(`Failure to start server: $err`);
  
)();

connectDB() 是我尝试通过mongoose.connect() 连接到 MongoDB 数据库。显然不是您之前想要调用的理想解决方案,但它确实有效。

【讨论】:

以上是关于无法使用 process.env 变量连接到数据库,但 process.env vars 在日志中打印的主要内容,如果未能解决你的问题,请参考以下文章

连接到 postgres 数据库失败

Mongoose 无法连接到 mLab 环境

Mongoose 无法连接到 mLab 环境

无法使用 MEAN 堆栈连接到 Mongodb.atlas 集群

将Sequelize连接到Google Cloud SQL

Express 设置process.env.NODE_ENV变量