node.js - 如何在 Nodejs 中使用环境变量作为数据库密码?
问题描述
我正在尝试使用 .env 文件隐藏我的数据库密码。但似乎编译器无法识别密码在哪里..
您可以看到环境变量 PWD,它是用于数据库密码的。
.env
代码。
PWD = 0000
SECRET = mySecret
在 server.js 中,您可以看到我使用 dotenv 模块并设置配置。
server.js
代码。
require("dotenv").config();
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
const expressSanitizer = require("express-sanitizer");
const router = require("./Routes/router");
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(expressSanitizer());
app.use(router);
app.listen(port, () => {
console.log(`listening to port ${port}`);
});
最后,这里的问题..你可以看到论点,process.env.PWD
. 我记录了它以检查它实际上是什么。它不是0000
,而是D://github/practice
只是项目目录路径..
我不明白发生了什么!我也能看到
console.log(process.env.PWD);
工作两次。当我跑的时候server.js
!
router.js
代码。
const { Sequelize } = require("sequelize");
console.log(process.env.PWD);
const sequelize = new Sequelize("vehicle", "root", process.env.PWD, {
host: "localhost",
port: "3306",
dialect: "mysql",
logging: false,
define: {
createdAt: false,
timestamps: false,
},
});
module.exports = sequelize;
以下是我运行代码时的错误。
AccessDeniedError [SequelizeAccessDeniedError]: Access denied for user 'root'@'localhost' (using password: YES)
at ConnectionManager.connect (E:\github\practice\node_modules\sequelize\lib\dialects\mysql\connection-manager.js:118:17)
at processTicksAndRejections (internal/process/task_queues.js:85:5) {
name: 'SequelizeAccessDeniedError',
parent: Error: Access denied for user 'root'@'localhost' (using password: YES)
at Packet.asError (E:\github\practice\node_modules\mysql2\lib\packets\packet.js:712:17)
at ClientHandshake.execute (E:\github\practice\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (E:\github\practice\node_modules\mysql2\lib\connection.js:425:32)
at PacketParser.onPacket (E:\github\practice\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (E:\github\practice\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (E:\github\practice\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:209:13)
at addChunk (_stream_readable.js:305:12)
at readableAddChunk (_stream_readable.js:286:11)
at Socket.Readable.push (_stream_readable.js:220:10) {
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)"
},
original: Error: Access denied for user 'root'@'localhost' (using password: YES)
at Packet.asError (E:\github\practice\node_modules\mysql2\lib\packets\packet.js:712:17)
at ClientHandshake.execute (E:\github\practice\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (E:\github\practice\node_modules\mysql2\lib\connection.js:425:32)
at PacketParser.onPacket (E:\github\practice\node_modules\mysql2\lib\connection.js:75:12)
at PacketParser.executeStart (E:\github\practice\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.<anonymous> (E:\github\practice\node_modules\mysql2\lib\connection.js:82:25)
at Socket.emit (events.js:209:13)
at addChunk (_stream_readable.js:305:12)
at readableAddChunk (_stream_readable.js:286:11)
at Socket.Readable.push (_stream_readable.js:220:10) {
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
sqlMessage: "Access denied for user 'root'@'localhost' (using password: YES)"
}
}
另外,如果有更好的隐藏数据库密码的解决方案,请告诉我..!感谢您阅读我的问题!
解决方案
你错过了一个非常重要和关键的代码行
dotenv.config({ path: "YOUR-PATH-TO-.ENV-FILE" });
就在你之后
require("dotenv").config();
您需要根据您共享的代码为 dotenv 提供包含 ENV_VARs 的文件的路径,您可以通过 2 种方式做到这一点
选项1
const dotenv = require("dotenv");
dotenv.config({ path: "YOUR-PATH-TO-.ENV-FILE" });
选项 2
require("dotenv").config({ path: "YOUR-PATH-TO-.ENV-FILE" );