TypeScript GraphQL dla MongoDB — Numio
Generuje typy dokumentów TypeScript MongoDB na podstawie schematu z adnotacjami @entity, @id, @column, @link, @embedded i @map przy użyciu @graphql-codegen/typescript-mongodb. Każdy typ @entity otrzymuje typ <Name>DbObject; pola bez dyrektywy są pomijane.
Zachowywanie zapisanego kształtu dokumentu MongoDB wpisanego obok typów GraphQL API tej samej jednostki.
Kiedy go używać
- Zachowywanie zapisanego kształtu dokumentu MongoDB wpisanego obok typów GraphQL API tej samej jednostki.
- Sprawdzanie, jak ścieżki @map i odniesienia @link przekładają się na zagnieżdżone obiekty i tablice ObjectId przed napisaniem kodu dostępu do danych.
Jak używać
- Wklej schemat, którego typy używają @entity i których pola używają @id, @column, @link, @embedded lub @map(path: ...).
- Przeczytaj typy DbObject pod koniec wyjścia; nad nimi generowane są same typy GraphQL.
- Skopiuj wynik do pliku .ts; importuje ObjectId z pakietu mongodb.
Schemat GraphQL z dyrektywami MongoDB
type User @entity {
id: ID! @id
email: String! @column @map(path: "login.email")
profile: Profile! @embedded
posts: [Post!]! @link
}
type Profile @entity(embedded: true) {
name: String! @column
}
type Post @entity {
id: ID! @id
title: String! @column
}Typy TypeScript DbObject
…
export type AdditionalEntityFields = {
path?: InputMaybe<Scalars["String"]["input"]>
type?: InputMaybe<Scalars["String"]["input"]>
}
import { ObjectId } from "mongodb"
export type UserDbObject = {
_id: ObjectId
login: {
email: string
}
profile: ProfileDbObject
posts: Array<PostDbObject["_id"]>
}
export type ProfileDbObject = {
name: string
}
export type PostDbObject = {
_id: ObjectId
title: string
}Szczegóły i ograniczenia
@id staje się _id: ObjectId, @link staje się _id połączonej jednostki (Array<PostDbObject["_id"]> dla list), a @map(path: "login.email") tworzy zagnieżdżony obiekt logowania.
Pola bez dyrektywy (brak @column, @id, @link, @embedded) nie są uwzględniane w typie DbObject; kolumny dopuszczające wartość null stają się opcjonalnymi właściwościami Maybe<T>.
Dane wyjściowe zawierają również standardowe typy wtyczek TypeScript (pominięte powyżej). Generowanie odbywa się w środowisku internetowym w przeglądarce.
FAQ
Czy muszę deklarować dyrektywy @entity i @column w moim schemacie?
Nie. Wtyczka dodaje własne definicje dyrektyw, dlatego też na wyjściu pojawia się typ wejścia AdditionalEntityFields.
W jaki sposób wpisywane są osadzone dokumenty?
Typ zadeklarowany z @entity(embedded: true) otrzymuje typ DbObject bez _id, a pole oznaczone @embedded odwołuje się do niego, na przykład profil: ProfileDbObject.
Dlaczego w typie DbObject brakuje pola?
Przechowywane są tylko pola z @id, @column, @link, @embedded lub @map. Dodaj @column, aby uwzględnić zwykłe pole.