使用 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'
});