类型“undefined”不可分配给类型“string |” 细绳[]'

Kri*_*que 18 node.js typescript

我只是想尝试主文件上的文件config.env

但不知怎的,它不起作用,但错误是错误的,它显示undefined但它已经存在

第一次尝试

require('dotenv').config({ path: `${__dirname}/../.env` })
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)

不知怎的,.env没有加载。

通过执行该文件

ts-node main.ts
Run Code Online (Sandbox Code Playgroud)

.env 文件

SESSION_SECRET = uq07nyvn4xadskdg
COOKIE_SECRET = 0k5kb4qi8shhi7u0n

DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_USER = root
DB_PASS = root
DB_NAME = db_name
Run Code Online (Sandbox Code Playgroud)

数据库连接

export const db = createPool({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
})
Run Code Online (Sandbox Code Playgroud)

会议

const sessionD = session({
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true,
  store: new MySQLStore({
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
  }),
})
Run Code Online (Sandbox Code Playgroud)

Ale*_*yne 32

dotenv不告诉打字稿任何事情。它所做的一切都是在运行时将您的内容放入.env其中process.env。这不会改变任何类型的任何东西。

所以你正在处理的process.env似乎有这种类型:

export interface ProcessEnv {
    [key: string]: string | undefined;
}
Run Code Online (Sandbox Code Playgroud)

这意味着您不能将其分配给不能为 的值undefined

const myVar: string = process.env.WHATEVER
// Type 'string | undefined' is not assignable to type 'string'.
//   Type 'undefined' is not assignable to type 'string'.
Run Code Online (Sandbox Code Playgroud)

解决方法是处理未定义的情况。如果有人忘记了该.env文件或删除了其中的一些条目怎么办?在这种情况下你的代码应该做什么?

也许,提供一个默认值:

const whatever: string = process.env.WHATEVER ?? 'whatever default'
Run Code Online (Sandbox Code Playgroud)

或者可能会抛出一个错误:

let whatever: string
if (process.env.WHATEVER) {
  whatever = process.env.WHATEVER
} else {
  throw new Error("WHATEVER environment variable is not set")
}
Run Code Online (Sandbox Code Playgroud)

TL;DR:处理此案undefined

  • 今天我了解到“??”是一件事。我喜欢 JavaScript。谢谢你! (5认同)

Din*_*nny 16

预期的类型是字符串或字符串数​​组,并且您正在传递打字稿无法识别的环境变量。因此,您必须将所有 .env 变量的环境变量类型转换为这样的字符串,并且错误将被删除。

secret: process.env.SESSION_SECRET as string;
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关类型断言的内容。


anl*_*nli 6

这在 2022 年对我有用:

我建议您为变量创建类型声明。将其命名为 env.d.ts 并将其与以下内容一起保存在源目录中,例如 /src

declare namespace NodeJS {
  interface ProcessEnv {
    readonly SESSION_SECRET: string
    readonly COOKIE_SECRET: string
    readonly DB_HOST: string
    readonly DB_PORT: string
    readonly DB_USER: string
    readonly DB_PASS: string
    readonly DB_NAME: string
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:端口是一个字符串,因为 dotenv 将所有内容都作为字符串处理

现在确保 env.d.ts 包含在 tsconfig.json 的 include 部分中(伪代码 - ... 代表其他属性:

{
  ...,
  "include": [
    "src/**/*.d.ts",
  ]
}
Run Code Online (Sandbox Code Playgroud)

现在变量应该可以被打字稿识别。