【问题标题】:Unable to load environement variables when running the server with typescript and node.js使用 typescript 和 node.js 运行服务器时无法加载环境变量
【发布时间】:2020-02-15 09:48:01
【问题描述】:

我使用typescript创建了一个node.js服务器,项目结构是这样的:

|--node_modules
|--server
   .env
   |-- build
   |-- src
       |-- database
       |-- controllers
       |-- models
       |-- routes
       |-- utils
       |-- app.ts
       |-- server.ts

app.ts:

import bodyParser from "body-parser";
import cors from "cors";
import { config } from "dotenv";
import express, { Express } from "express";
config({ path: __dirname + "../.env" });
import db from "./database/config";

db.once("open", () => logger.info("connected to the database"));

// checks if connection with the database is successful
db.on("error", console.error.bind(console, "MongoDB connection error:"));

const app: Express = express();
.
.
.

数据库/config.ts:

import mongoose from "mongoose";
import { logger } from "../utils/log";

const url = process.env.MONGODB_DEV_HOST;

mongoose
  .connect(url, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false
  })
  .then(() => {
    logger.info("Database starts successfully");
  })
  .catch((error) => {
    logger.error("Error when starting database: \n", error);
  });

const db = mongoose.connection;

export default db;

.env:

MONGODB_DEV_HOST=mongodb://localhost:27017/db

当我运行我的服务器时,由于 url 未定义,mongodbserver 出现错误。 我将.envfile 放在项目的根目录中。我是否遗漏了配置中的某些内容?

【问题讨论】:

    标签: node.js mongodb typescript mongoose dotenv


    【解决方案1】:

    我遇到了同样的问题。但在我的例子中,TSLint 捕获了一个错误 No overload matches this call. Overload 1 of 3,..,因为 mongodb 主机 URL 是 undefined

    我认为这是由于 .env 的 global.d.ts 声明,其中 ProcessEnv 接口返回 stringundefined。 这可以在这里找到node_modules/@types/node/globals.d.ts

    来自 global.d.ts 的原始 ProcessEnv

    interface ProcessEnv {
      [key: string]: string | undefined;
    }
    

    我是如何解决这个问题的

    我通过在我的src 文件夹中创建一个配置文件来解决这个问题。你实际上可以把它放在任何地方。

    配置文件强制process.env 仅返回string,我将变量导出为常量,以便直接在我的控制器、中间件等内部使用。

    这是我的配置文件的样子:

    import { config } from 'dotenv';
    
    config();
    
    export const {
      MONGODB_DEV_HOST,
      JWT_SECRET,
      FACEBOOK_API_KEY,
    } = process.env as {
      [key: string]: string;
    };
    
    

    【讨论】:

      【解决方案2】:

      试试这样:

      import {} from 'dotenv/config'
      

      为什么会这样? .基本上,在您的代码运行之前,在深度优先搜索遍历中执行导入语句,然后它会设置您的 env 变量,这当然是未定义的,并猜测您的配置调用何时被调用?在运行时。发生这种情况是因为 import 语句与 require 语句的设计非常不同。直接从文件顶部的 import 语句调用配置可以解决这个问题。

      【讨论】:

      • 不指定一个空的导入列表,而是将依赖项导入为import 'dotenv/config';
      猜你喜欢
      • 1970-01-01
      • 2019-04-12
      • 2012-11-05
      • 1970-01-01
      • 2019-06-19
      • 2011-04-22
      • 2023-03-25
      • 1970-01-01
      • 2019-11-08
      相关资源
      最近更新 更多