mongoose TypeError:无效的架构配置:`admin`不是路径`ADMIN`中的有效类型,NestJs mongodb with SWC

km0tfn4u  于 2023-10-19  发布在  Go
关注(0)|答案(2)|浏览(127)

我是第一次使用SWC,我只在使用SWC编译器时遇到过这个错误。没有SWC,一切都很好
错误

throw new TypeError(Invalid schema configuration: \ ${瓦尔}不是 + ^
TypeError:无效的架构配置:admin不是路径ADMIN上的有效类型。Blockquote
有效架构类型的序列号。

说明

我有一个User模式,其中有一个名为role的属性,它的类型是一个名为Roleenum

enum

export enum Role {
  ADMIN = 'admin',
  SALES = 'sales',
  MARKETING = 'marketing',
}

验证码

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
import { Role } from '../../../enum/role';

@Schema({ timestamps: true })
export class User {
  @Prop({ required: true, default: null })
  email: string;

  @Prop({ required: true, default: null })
  password: string;

  @Prop({ required: true, enum: Role, default: Role.ADMIN })
  role: Role;
}

export const UserSchema = SchemaFactory.createForClass(User);
export type UserDocumnet = User & Document;

如果我删除Role作为类型,错误就会消失,就像这样

@Prop({ required: true, enum: Role, default: Role.ADMIN })
      role: string;

无论Role enum中的index 0处存在什么值,它都会抛出错误。例如,如果我在枚举中向上移动SALES,它会显示sales inside error
SWC配置

我安装了swc,

npm i --save-dev @swc/cli @swc/core

nest-json.json

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true,
    "builder": "swc",
    "typeCheck": true
  }
}
cyvaqqii

cyvaqqii1#

看起来这是使用SWC构建时NestJS v10中的一个bug。在使用nestjs包的v7或v8(没有SWC)时,我无法重现这个问题。
关于问题本身,它来自@nestjs/mongoose试图创建第二个模式(除了User实体)。
原始实体的模式采用以下形式:

{
  email: { required: true, default: null, type: [Function: String] },
  password: { required: true, default: null, type: [Function: String] },
  role: {
    required: true,
    enum: { ADMIN: 'admin', SALES: 'sales', MARKETING: 'marketing' },
    default: 'admin',
    type: { ADMIN: 'admin', SALES: 'sales', MARKETING: 'marketing' }
  }
}

但是在处理上面的模式时,@nestjs/mongoose尝试创建第二个模式,其形式为:

{ ADMIN: 'admin', SALES: 'sales', MARKETING: 'marketing' }

根据https://mongoosejs.com/docs/guide.html#definition,这不是有效的mongoose架构。
因为这不是一个有效的模式,因此出现错误。
只有在使用SWC时才会弹出此问题。

uemypmqf

uemypmqf2#

所以我在**@Robin托马斯的回答的帮助下找到了解决方案**。根据他的回答,当使用SWC时,@nestjs/mongoose没有正确转换enum。当我们使用TSC comnpiler时,它可以正确转换enum现在这意味着它与SWC如何处理enum转换有关。所以我搜索了一下,发现SWC不能很好地与外部enum文件一起工作。不仅如此,SWC不能很好地与auto imports一起工作,如果你试图将一个ts file调用到另一个ts file中,如果你的导入是从src/etc/etc开始的,
SWC抛出错误
CAN NOT FIND MODULE xyz

解决方案

我习惯把枚举文件放在一个单独的文件夹中,地址是root of source or src。**但特别是SWC如果枚举是从另一个文件导入的,则不起作用。不过,当枚举在同一个文件中声明时,它会正确编译。

您还必须从outisde导入文件,如../etc/ectsrc/etc/etc
将此讨论保留在ENUM部分https://github.com/swc-project/swc/issues/1160#issuecomment-738320066
将此讨论作为导入部分https://github.com/swc-project/swc/issues/7603#issuecomment-1692146920
我这么做了,成功了

export enum Role {
  ADMIN = 'admin',
  SALES = 'sales',
  MARKETING = 'marketing',
}

@Schema({ timestamps: true })
export class User {
  @Prop({ required: true, default: null })
  email: string;

  @Prop({ required: true, default: null })
  password: string;

  @Prop({ required: true, enum: Role, default: Role.ADMIN })
  role: Role;
}

相关问题