node.js - Mongoose şeması ile TypeScript enum kullanımı
Bir enum içeren bir şemam var:
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 bir enum'dur.
İlk problem zaten burada: Şemayla kullanmak için enum'u bir string dizisine dönüştürmem gerekiyor.
İkincisi, şema oluşturulurken bir enum değerini doğrudan kullanmak istiyorum.
new GameMap({
name: 'Test',
type: GameMode.ASSAULT
});
döner ValidationError: type: '1', 'type' yolu için geçerli bir enum değeri değildir.
Model enum özelliğine ayarladığım dizi dizisi nedeniyle bunun gerçekten çalışıp çalışmayacağından emin değilim.
Benim fikrim, şema oluşturulurken bir tür dönüşümü yaratmak olurdu. Bu, Mongoose ile çalışır mı yoksa nesne oluşturma için bir çeşit yardımcı mı yaratmam gerekir?
Cevap #1
GameMode.ASSAULT, sayısal değeri olarak değerlendiriliyor, ancak GameMode türün bir string olmasını bekliyor. String değerlendirmesinin ne olmasını bekliyorsunuz? Enum'un string değerine ihtiyacınız varsa, ona GameMode[GameMode.ASSAULT] ile erişebilirsiniz; bu, ASSAULT sonucunu bir string olarak döndürecektir.
Örneğin:
enum TEST {
test1 = 1,
test2 = 2
}
console.log(TEST[TEST.test1]);
//Prints "test1"
Mongoose belgelerindeki doğrulama bilgisine göre, enum doğrulamasına sahip String türündeki şema özelliklerinde, Mongoose'un beklediği enum bir dizi stringdir.
Bu, CUtility.enumToArray(GameMode)'in ya size dizinleri string olarak içeren bir dizi döndürmesi gerektiği ya da enum'un metin/string değerlerinden oluşan bir dizi döndürmesi gerektiği anlamına gelir—hangi değeri veritabanınızda saklamayı bekliyorsanız.
Doğrulama hatası, 1'in CUtility.enumToArray(GameMode) tarafından üretilen dizide bulunmadığını veya doğrulamanın GameMode.ASSAULT'ı 1'in string temsilini beklerken bir sayı olarak gördüğünü ima ediyor gibi görünüyor. Gönderdiğiniz enum değerini bir string'e dönüştürmeniz gerekebilir.
CUtility.enumToArray(GameMode) çıktısı nedir? Bu, hangi ikisinden birinin sizin sorununuz olduğunu belirlemenize yardımcı olmalıdır.
Cevap #2
Neden sadece özel getter/setter oluşturmuyorsun:
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],
},
});
DÜZENLEME: Getter'ı açıkça etkinleştirmeyi unutmayın
schema.set('toJSON', { getters: true });
// and/or
schema.set('toObject', { getters: true });
Bu şekilde, bir özelliği veritabanında, backend'de ve frontend'de (json yanıtı) tam olarak nasıl temsil etmek istediğinizi ince ayar yapabilirsiniz.
