TypeScript GraphQL voor MongoDB — Numio
Genereert TypeScript MongoDB-documenttypen op basis van een schema geannoteerd met @entity, @id, @column, @link, @embedded en @map, met behulp van @graphql-codegen/typescript-mongodb. Elk @entity-type krijgt een <Name>DbObject-type; velden zonder richtlijn worden weggelaten.
De opgeslagen MongoDB-documentvorm behouden naast de typen GraphQL API van dezelfde entiteit.
Wanneer gebruik je dit?
- De opgeslagen MongoDB-documentvorm behouden naast de typen GraphQL API van dezelfde entiteit.
- Zien hoe @map-paden en @link-referenties zich vertalen in geneste objecten en ObjectId-arrays voordat code voor gegevenstoegang wordt geschreven.
Hoe werkt het
- Plak een schema waarvan de typen @entity gebruiken en waarvan de velden @id, @column, @link, @embedded of @map(path: ...) gebruiken.
- Lees de DbObject-typen aan het einde van de uitvoer; de GraphQL-typen zelf worden erboven gegenereerd.
- Kopieer het resultaat naar een .ts-bestand; het importeert ObjectId uit het mongodb-pakket.
GraphQL-schema met MongoDB-richtlijnen
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
}TypeScript DbObject-typen
…
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
}Details en beperkingen
@id wordt _id: ObjectId, @link wordt de _id van de gekoppelde entiteit (Array<PostDbObject["_id"]> voor lijsten) en @map(pad: "login.email") creëert een genest login-object.
Velden zonder richtlijn (geen @column, @id, @link, @embedded) zijn niet opgenomen in het type DbObject; null-kolommen worden optionele Maybe<T>-eigenschappen.
De uitvoer bevat ook de standaard typen typescript-plug-ins (hierboven weggelaten). Het genereren wordt uitgevoerd in een Web Worker in uw browser.
FAQ
Moet ik de richtlijnen @entity en @column in mijn schema declareren?
Nee. De plug-in voegt zijn eigen richtlijndefinities toe, wat ook de reden is dat er een AdditionalEntityFields-invoertype in de uitvoer verschijnt.
Hoe worden ingesloten documenten getypt?
Een type dat is gedeclareerd met @entity(embedded: true) krijgt het type DbObject zonder _id, en een veld gemarkeerd met @embedded verwijst ernaar, bijvoorbeeld profiel: ProfileDbObject.
Waarom ontbreekt een veld in het type DbObject?
Alleen velden met @id, @column, @link, @embedded of @map zijn opgeslagen velden. Voeg @column toe om een gewoon veld op te nemen.