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