使用dotenv加载环境变量仍然返回undefined



我很困惑。根据提示,我的.env文件在根目录下。我已经尝试过require('dotenv').config()import dotenv from 'dotenv',然后是dotenv.config()。正如您将看到的,我已经尝试向config传递一个绝对路径。试图控制台记录环境变量总是返回未定义。我试着检查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文件的绝对路径不正确。在我这样做之后,环境变量拉得很好。

我遇到了一个新的错误:

Upload Error:  The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
如果我不能解决这个问题,我将发布另一个问题。谢谢,每一个人。

如果在.env文件中使用AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,则不必再次使用它们来创建S3对象。AWS自动识别这些密钥,并将它们用于S3对象创建。您只需要region就可以创建S3对象。

const s3 = new S3({
region: 'your region'
});