如何在 Typescript 中加载 dotenv

won*_*ids 6 mongodb express typescript

我正在尝试使用 Typescript 加载 .env 环境变量。

这是我的.envapp.ts文件

//.env

DB_URL=mongodb://127.0.0.1:27017/test
Run Code Online (Sandbox Code Playgroud)
//.env

DB_URL=mongodb://127.0.0.1:27017/test
Run Code Online (Sandbox Code Playgroud)

当我app.ts使用ts-node src/app.ts命令运行时,抛出此错误

// app.ts

import * as dotenv from 'dotenv';
import express from 'express';
import mongoose from 'mongoose';

dotenv.config();
mongoose.connect(process.env.DB_URL, config);
Run Code Online (Sandbox Code Playgroud)

但是当我在下面添加 if 语句时,它运行良好

Unable to compile TypeScript:
src/app.ts:50:18 - error TS2769: No overload matches this call.
  Overload 1 of 3, '(uris: string, callback: (err: MongoError) => void): Promise<typeof import("mongoose")>', gave the following error.
    Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
      Type 'undefined' is not assignable to type 'string'.
  Overload 2 of 3, '(uris: string, options?: ConnectionOptions | undefined): Promise<typeof import("mongoose")>', gave the following error.
    Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
      Type 'undefined' is not assignable to type 'string'.

50 mongoose.connect(process.env.DB_URL, config);
Run Code Online (Sandbox Code Playgroud)
//app.ts
import * as dotenv from 'dotenv';
import express from 'express';
import mongoose from 'mongoose';

dotenv.config();

//Add this code
if (!process.env.DB_URL) {
  process.exit(1);
}

mongoose.connect(process.env.DB_URL, config);
Run Code Online (Sandbox Code Playgroud)

我想知道为什么在下面的代码中没有抛出这个错误?

tha*_*.ts 19

从错误消息中,您可以得出结论,TypeScript 期望 的第一个参数mongoose.connect()是 astring但环境变量可以是stringundefined

通过添加条件,可以消除的可能性process.env.DB_URLundefined当在一次调用mongoose.connect(process.env.DB_URL, config)

如果您确定它永远不会undefined,您可以使用 TypeScript非空断言运算符

mongoose.connect(process.env.DB_URL!, config);
Run Code Online (Sandbox Code Playgroud)

提示:

代替

import * as dotenv from 'dotenv';
...
dotenv.config();
Run Code Online (Sandbox Code Playgroud)

你可以做如下

import 'dotenv/config'
Run Code Online (Sandbox Code Playgroud)

这将确保在下一个import语句之前设置环境变量,因此您只需在应用程序的主文件中执行此操作一次。

  • `从'dotenv/config'导入'应该是'导入'dotenv/config'` (3认同)