Node.js 将TypeScript枚举与mongoose架构一起使用

Node.js 将TypeScript枚举与mongoose架构一起使用,node.js,mongodb,typescript,mongoose,enums,Node.js,Mongodb,Typescript,Mongoose,Enums,我有一个带有枚举的架构: export interface IGameMapModel extends IGameMap, Document {} export const gameMapSchema: Schema = new Schema({ name: { type: String, index: { unique: true }, required: true }, type: { type: String, enum: CUtility.enumToArray(GameMod

我有一个带有枚举的架构:

export interface IGameMapModel extends IGameMap, Document {}

export const gameMapSchema: Schema = new Schema({
  name: { type: String, index: { unique: true }, required: true },
  type: { type: String, enum: CUtility.enumToArray(GameMode) }
});

export const GameMap: Model<IGameMapModel> = model<IGameMapModel>('GameMap', gameMapSchema);
返回
ValidationError:type:“1”不是路径“type”的有效枚举值。

由于我在model enum属性中设置了字符串数组,我不确定这是否可以实际工作


我的想法是在模式创建过程中创建某种类型的类型转换。这是否适用于猫鼬,或者我必须为对象创建某种帮助器吗?

GameMode。攻击的计算方式是数值,但
GameMode
希望类型是字符串。您希望字符串的计算结果是什么?如果需要枚举的字符串值,可以使用
GameMode[GameMode.attack]
访问它,它将以字符串形式返回
attack

例如:

enum测试{
test1=1,
test2=2
}
log(TEST[TEST.test1]);
//打印“test1”
在具有
enum
验证的
type
String
的架构属性中,mongoose希望在字符串数组中使用的
enum

这意味着
CUtility.enumToArray(GameMode)
需要将索引数组作为字符串返回给您,或者将
enum
的文本/字符串值数组返回给您,无论您希望在数据库中存储哪个值

验证错误似乎暗示
1
不包含在由
CUtility.enumToArray(GameMode)
生成的数组中,或者验证将
GameMode.Attack
视为一个数字,而预期字符串表示形式为
1
。您可能需要将传入的
enum
值转换为字符串


CUtility.enumToArray(游戏模式)
的输出是什么?这将帮助您确定这两个问题中的哪一个是您的问题。

为什么不创建自定义getter/setter:

const schema = new Schema ({
    enumProp: {
            type: Schema.Types.String,
            enum: enumKeys(EnumType),
            get: (enumValue: string) => EnumType[enumValue as keyof typeof EnumType],
            set: (enumValue: EnumType) => EnumType[enumValue],
        },
});
编辑: 不要忘记显式启用getter

schema.set('toJSON', { getters: true }); 
// and/or
schema.set('toObject', { getters: true });

通过这种方式,您可以很好地控制在db、后端和前端(json响应)中如何准确地表示道具。

我的最后一句话包括了我的问题,如果您能阅读我的问题并更新您的答案,我将不胜感激。同样,您希望“type”参数是什么?示例?由于架构的原因,它必须是字符串。我的问题是,是否有可能提供enum,它被mongoose或我创建的某个函数转换。有点,是的
CUtility.enumToArray(游戏模式)
返回
[“攻击”、“更多”]
。知道为什么会返回TypeError,但是我想知道是否有办法使用
new Test({type:GameMode.Attack})
创建一个对象,mongoose或其他助手方法会将其转换为字符串,这样我就不必每次都使用
GameMode[GM.Attack]
。我想你可能只需要创建自己的助手方法,但是,通过对代码进行抽象,这可能不会为您节省太多代码。
schema.set('toJSON', { getters: true }); 
// and/or
schema.set('toObject', { getters: true });