【问题标题】:Loading environment variables with dotenv still returns undefined使用 dotenv 加载环境变量仍然返回 undefined
【发布时间】:2021-11-02 04:39:42
【问题描述】:

我在这里不知所措。按照说明,我的 .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");
}

【问题讨论】:

    标签: javascript node.js environment-variables dotenv


    【解决方案1】:

    我认为您需要使用process.env 来访问您的环境变量。尝试登录process.env.AWS_ACCESS_KEY_ID

    【讨论】:

    • 这实际上是我最初所做的。首先,我尝试直接访问它们。然后将它们存储到变量中。然后将它们存储到一个数组中。然后将它们存储到一个对象中。全部返回未定义。
    • 您是否有截图或代码可供我查看?您是否还可以验证问题是否仅针对该项目?
    • 我所有的代码都在上面。到目前为止,这就是这个项目的整个后端。
    • 但它似乎是特定于这个项目的。我创建了一个只有 package.json、.env 和 index.js 的测试项目。以同样的方式将 dotenv 与测试变量一起使用,它返回的值就好了。所以我不确定是什么原因造成的。
    • 注释掉所有不必要的内容:D.
    【解决方案2】:

    好的,我想通了。首先,我正在使用打字稿并忘记编译。其次,.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.
    

    如果我无法解决这个问题,我会发布另一个问题。谢谢大家。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-09
        • 2015-09-02
        • 1970-01-01
        • 2020-08-09
        • 2021-10-14
        • 2021-11-08
        • 2019-04-22
        • 2020-10-02
        • 2020-01-22
        相关资源
        最近更新 更多