使用 dotenv 加载环境变量仍然 returns 未定义
Loading environment variables with dotenv still returns undefined
我在这里不知所措。按照说明,我的 .env
文件位于我的根目录中。我已经通过 require('dotenv').config()
和 import dotenv from 'dotenv'
进行了尝试,然后是 dotenv.config()
。正如您将看到的,我已尝试将配置传递给绝对路径。尝试控制台记录环境变量总是 returns 未定义。我尝试检查 dotenv.error
,您也会看到,但条件没有触发。
我看到的都是未定义的。就好像我的 .env
文件根本不存在一样。
这是我当前状态下的代码。任何帮助将不胜感激。
import express from "express";
import cors from "cors";
import multer from "multer";
import AWS, { PutObjectCommandOutput, S3, S3ClientConfig } from "@aws-sdk/client-s3";
import { createReadStream } from "fs";
import path from 'path';
const dotenvAbsolutePath = path.join(__dirname, '.env')
const app = express();
const port = 5000;
// require('dotenv').config();
const dotenv = require('dotenv').config({
path: dotenvAbsolutePath,
});
if (dotenv.error) {
console.log(`DOTENV ERROR: ${dotenv.error.message}`);
throw dotenv.error;
}
const keys = {
key: process.env.AWS_ACCESS_KEY_ID,
secret: process.env.AWS_SECRET_KEY,
region: process.env.AWS_REGION
};
console.log(dotenv);
const upload = multer({
storage: multer.diskStorage({ destination: "./tmp" }),
});
const s3 = new S3({
credentials: { accessKeyId: keys.key!, secretAccessKey: keys.secret! },
region: keys.region!
});
app.use(cors());
app.post("/", upload.single("pdf_upload"), async (req, res) => {
let fileName: string | undefined;
// let fileBuffer: Buffer | undefined;
let uploadResponse: PutObjectCommandOutput | undefined;
if (req.file) {
fileName = req.file.originalname;
// fileBuffer = req.file.buffer
console.log("HTTP Request Received");
const fileReadStream = createReadStream(req.file!.path).on(
"ready",
async () => {
try {
console.log("Stream is Readable");
console.log(fileReadStream.bytesRead);
uploadResponse = await s3.putObject({
Bucket: "fiberpunch-test",
Key: fileName,
Body: fileReadStream,
});
res.header("Access-Control-Allow-Origin", "*");
res
.send({ file: { ETag: uploadResponse.ETag, Key: fileName } })
.status(200);
} catch (err: any) {
console.log("Upload Error: ", err.message);
res.sendStatus(500);
console.log(fileReadStream.bytesRead);
}
}
);
}
});
try {
app.listen(port);
console.log(`listening at port ${port}`);
} catch (err) {
console.log("ERROR SETTING UP SERVER");
}
我认为您需要使用 process.env
来访问您的环境变量。尝试记录 process.env.AWS_ACCESS_KEY_ID
好的,我明白了。首先,我在用打字稿工作,忘了编译。其次,.env 文件的绝对路径不正确。我这样做之后,环境变量pull就好了。
不过我 运行 遇到了一个新错误:
Upload Error: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
如果我无法解决这个问题,我会 post 另一个问题。谢谢大家。
如果您在 .env 文件中使用 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,则不必再次使用它们来创建 S3 对象。 AWS 会自动识别这些密钥并将它们用于创建 S3 对象。
您只需要区域即可创建 S3 对象。
const s3 = new S3({
region: 'your region'
});
我在这里不知所措。按照说明,我的 .env
文件位于我的根目录中。我已经通过 require('dotenv').config()
和 import dotenv from 'dotenv'
进行了尝试,然后是 dotenv.config()
。正如您将看到的,我已尝试将配置传递给绝对路径。尝试控制台记录环境变量总是 returns 未定义。我尝试检查 dotenv.error
,您也会看到,但条件没有触发。
我看到的都是未定义的。就好像我的 .env
文件根本不存在一样。
这是我当前状态下的代码。任何帮助将不胜感激。
import express from "express";
import cors from "cors";
import multer from "multer";
import AWS, { PutObjectCommandOutput, S3, S3ClientConfig } from "@aws-sdk/client-s3";
import { createReadStream } from "fs";
import path from 'path';
const dotenvAbsolutePath = path.join(__dirname, '.env')
const app = express();
const port = 5000;
// require('dotenv').config();
const dotenv = require('dotenv').config({
path: dotenvAbsolutePath,
});
if (dotenv.error) {
console.log(`DOTENV ERROR: ${dotenv.error.message}`);
throw dotenv.error;
}
const keys = {
key: process.env.AWS_ACCESS_KEY_ID,
secret: process.env.AWS_SECRET_KEY,
region: process.env.AWS_REGION
};
console.log(dotenv);
const upload = multer({
storage: multer.diskStorage({ destination: "./tmp" }),
});
const s3 = new S3({
credentials: { accessKeyId: keys.key!, secretAccessKey: keys.secret! },
region: keys.region!
});
app.use(cors());
app.post("/", upload.single("pdf_upload"), async (req, res) => {
let fileName: string | undefined;
// let fileBuffer: Buffer | undefined;
let uploadResponse: PutObjectCommandOutput | undefined;
if (req.file) {
fileName = req.file.originalname;
// fileBuffer = req.file.buffer
console.log("HTTP Request Received");
const fileReadStream = createReadStream(req.file!.path).on(
"ready",
async () => {
try {
console.log("Stream is Readable");
console.log(fileReadStream.bytesRead);
uploadResponse = await s3.putObject({
Bucket: "fiberpunch-test",
Key: fileName,
Body: fileReadStream,
});
res.header("Access-Control-Allow-Origin", "*");
res
.send({ file: { ETag: uploadResponse.ETag, Key: fileName } })
.status(200);
} catch (err: any) {
console.log("Upload Error: ", err.message);
res.sendStatus(500);
console.log(fileReadStream.bytesRead);
}
}
);
}
});
try {
app.listen(port);
console.log(`listening at port ${port}`);
} catch (err) {
console.log("ERROR SETTING UP SERVER");
}
我认为您需要使用 process.env
来访问您的环境变量。尝试记录 process.env.AWS_ACCESS_KEY_ID
好的,我明白了。首先,我在用打字稿工作,忘了编译。其次,.env 文件的绝对路径不正确。我这样做之后,环境变量pull就好了。
不过我 运行 遇到了一个新错误:
Upload Error: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
如果我无法解决这个问题,我会 post 另一个问题。谢谢大家。
如果您在 .env 文件中使用 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,则不必再次使用它们来创建 S3 对象。 AWS 会自动识别这些密钥并将它们用于创建 S3 对象。 您只需要区域即可创建 S3 对象。
const s3 = new S3({
region: 'your region'
});