【问题标题】:Using TypeScript enum with mongoose schema将 TypeScript 枚举与猫鼬模式一起使用
【发布时间】:2017-11-01 14:52:12
【问题描述】:

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

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);

GameMap 是一个枚举。

第一个问题已经出现:我需要将枚举转换为字符串数组才能将其与架构一起使用。

其次,我想在架构创建期间直接使用枚举值。

new GameMap({
  name: 'Test',
  type: GameMode.ASSAULT
});

返回ValidationError: type: '1' is not a valid enum value for path 'type'.

由于我在模型枚举属性中设置的字符串数组,我不确定这是否真的可以工作。

我的想法是在架构创建期间创建某种类型的转换。这是否适用于猫鼬,还是我必须创建某种帮助器来创建对象?

【问题讨论】:

    标签: node.js mongodb typescript mongoose enums


    【解决方案1】:

    GameMode.ASSAULT 正在评估它的数值,但 GameMode 期望类型是字符串。您期望字符串评估是什么?如果需要枚举的字符串值,可以使用GameMode[GameMode.ASSAULT] 访问它,这将返回ASSAULT 作为字符串。

    例如:

    enum TEST {
        test1 = 1,
        test2 = 2
    }
    
    console.log(TEST[TEST.test1]);
    //Prints "test1"
    

    Mongoose docs on validation,在具有StringStringtype 的架构属性中,猫鼬期望在字符串数组中的enum

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

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

    CUtility.enumToArray(GameMode) 的输出是什么?这应该可以帮助您确定两者中的哪一个是您的问题。

    【讨论】:

    • 我的最后一句话包括我的问题,如果您能阅读我的问题并更新您的答案,我将不胜感激。
    • 再次,您期望“type”参数是什么?例子?
    • 由于架构的原因,它必须是一个字符串。我的问题是是否有可能提供枚举并且它被猫鼬或我创建的某些函数转换。
    • 有点,是的。 CUtility.enumToArray(GameMode) 返回['ASSAULT','MORE']。知道返回 TypeError 的原因,但我想知道是否有一种方法可以使用 new Test({type: GameMode.ASSAULT}) 和 mongoose 或其他辅助方法创建一个对象,因此我不必每次都使用 GameMode[GM.Assault]。跨度>
    • 我认为您可能只需要创建自己的辅助方法,但这可能不会通过抽象来为您节省大量代码。
    【解决方案2】:

    为什么不直接创建自定义 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 });
    

    通过这种方式,您可以精确控制您希望如何在数据库、后端和前端(json 响应)中表示道具。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2015-02-15
      • 2017-06-26
      • 2011-07-02
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多