【问题标题】:NestJS Module not found: Error when trying to resolve enums in typescript找不到 NestJS 模块:尝试解析打字稿中的枚举时出错
【发布时间】:2023-02-02 06:45:32
【问题描述】:

我有一个带有 typescript 设置的 nestjs 项目(显然我删除了与问题无关的东西)

我想做的是以下

在文件 data-basic-input.dto.ts 中,我按以下方式导入 data-type.enum.ts

`import { DataType } from '@shortcut/constants/enums/data-type.enum';`

data-type.enum.ts 包含以下代码

`export enum DataType {
  L1 = 101,
  H1 = 201,
  L2 = 102,
  H2 = 202,
  L3 = 103,
  H3 = 203,
  L4 = 104,
}`

当我尝试构建和运行项目时,出现以下错误

ERROR in ./src/datas/dtos/data-basic-input.dto.ts 24:147-251 Module not found: Error: Can't resolve './c:/Projects/project/libs/constants/src/enums/data-type' in 'c:\Projects\project\src\alarms\dtos' @ ./src/alarms/dtos/data-input.dto.ts 17:32-66 ....

所以,当我尝试导入一个枚举时,它没有找到它......来自同一文件夹的其他导入工作正常

有趣的是,这个错误只发生在 Windows 上,我在 Mac 或 Linux 上试过,一切正常

附加信息:

nest-cli.json 的外观如下

为了使用这种类型的导入,我在 tsconfig.json 中进行了此设置

我安装了以下版本

  • 打字稿 - 4.9.4
  • Webpack - 5.75.0
  • ts-loader - 9.4.2
  • tsconfig 路径 - 4.1.1

任何能给我指明正确方向的想法都会受到欢迎 非常感谢

我尝试过但没有用的东西

  • 重命名文件末尾没有枚举
  • 尝试导出常量枚举数据类型,因此在枚举之外添加一个常量
  • 尝试通过在 tsconfig.json 中设置“traceResolution”进行调试:true 但通过读取堆栈,我发现文件正在被找到并正确加载
  • 各种不同的 tsconfig 或 webpack 选项

【问题讨论】:

    标签: typescript webpack import enums nestjs


    【解决方案1】:

    为了让枚举在我的 dto 文件中工作,我很幸运,如下所示:

    // create-user.dto
    
    import { ApiProperty } from '@nestjs/swagger';
    
    import {
      IsEnum,
    } from 'class-validator';
    
    import { RoleEnum } from '../enum/role.enum';
    
    export class CreateUserDto {
    
      ...
    
      @ApiProperty({
        description: "The user's role.",
        example: 'EMPLOYEE',
      })
      @IsEnum(RoleEnum)
      @IsNotEmpty()
      role: RoleEnum;
    }
    

    从我的导入中可以看出,我已经创建了我的role.enum 文件:

    // role.enum
    
    export enum RoleEnum {
      ADMINISTRATOR = 'ADMINISTRATOR',
      MANAGER = 'MANAGER',
      EMPLOYEE = 'EMPLOYEE',
      GUEST = 'GUEST',
    }
    

    对于它的价值,这是我的 user.entity 文件的样子:

    // user.entity
    
    ...
    
    @Column({
        type: 'enum',
        enum: RoleEnum,
      })
      role: RoleEnum;
    

    按照这种方法,我可以利用内置的验证器来检查合法的枚举值。如果传入WORKER之类的内容,服务器将返回 400 错误。

    【讨论】:

    • 你好,达蒙。感谢您的回答。事实上,如果您使用相对导入,它会正常工作,并且那些也在我的项目中工作。另一方面,我更愿意使用非相对导入使它们工作,即。 import { TestEnum } from '@TestModule/constants/test-enum.ts' 或这种形式的东西
    【解决方案2】:

    我的名为@node-operations/shared 的本地包存在完全相同的问题。我的项目可以构建但无法以同样的错误开始。似乎 nest swagger 插件需要在运行时检查类型并希望它们靠近项目。我做了一个小技巧:

    1. 添加到 tsconfig.json :
        "paths": {
          "@node-operations/shared": [ "../shared" ]
        },
        "include": [
          "../shared", "./src"
        ]
      
      1. 将 nest-cli.json 从
        "sourceRoot": "src",
      

        "sourceRoot": "lp-proxy-backend/src",
      

      在大摇大摆之后,终于可以在启动时找到所有内容,因为现在我的库位于 nest 应用程序的 dist 文件夹中。

      这真的出乎意料,它只发生在枚举上,只有启用了 swagger 模块并且只在开发模式下。我做了一个issue on github,但我怀疑有人会浏览它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2021-01-07
      • 2013-12-30
      相关资源
      最近更新 更多