Bu popüler web teknolojilerini kullanarak kendi API'nizi oluşturun.

GraphQL ve NestJS, size API'leriniz için sağlam bir temel ve ölçeklenebilir web uygulamaları oluşturmak için kullanımı kolay bir çerçeve sağlayarak mükemmel bir ortaklık oluşturur. Kombinasyon, üretime hazır uygulamalar oluşturmak için mükemmeldir ve her ikisi de günümüzün teknoloji ekosisteminde çok alakalı araçlardır.

Her iki ürünü kullanarak nasıl API oluşturabileceğiniz hakkında daha fazla bilgi edinin.

GraphQL Nedir?

GraphQL bir veri sorgulama ve işleme dilidir API'leri daha kesin ve öz bir şekilde oluşturmak için kullanabilirsiniz. GraphQL, bir API'de var olan verilerin eksiksiz ve yeterli bir tanımını sağlar ve müşteriye tam olarak ihtiyaç duyulan verileri elde etmesi için güç verir.

GraphQL, kesin veri sorgularından daha iyi geliştirici araçlarına kadar, REST API'lerinde bulunmayan birçok özellik sağlar. grafik editör. Ayrıca, tek bir istek yoluyla birden çok kaynağı sorgulamanıza olanak tanır.

NestJS Nedir?

NestJS, ölçeklenebilir ve verimli sunucu tarafı uygulamaları oluşturmak için kullanabileceğiniz ilerici bir Node.js çerçevesidir. NestJS, GraphQL desteği, GRPC, WebSockets vb. gibi hızlı ve kolay geliştirme araçlarının yanı sıra birçok eklenti sağlar.

instagram viewer

NestJS, modüller, denetleyiciler, hizmetler ve şemalar kullanan optimize edilmiş proje yapısıyla ekosistemde iyi bilinir. Yerleşik CLI'si, yapılandırılmış bir API mimarisi oluşturmanıza olanak tanır. Kullanabilirsiniz bağımlılık enjeksiyon ilkeleri bir uygulamanın parçalarının birbirleriyle nasıl iletişim kurduğunu kontrol etmek için.

NestJS ve MongoDB ile GraphQL Uygulaması

NestJS ve GraphQL ile bir API oluşturmadan önce doğru bağımlılıklara sahip olmanız gerekir. ihtiyacın var Node.js'yi yüklemek için ve çalıştırarak yükleyebileceğiniz NestJS npm ben -g @nestjs/cli.

Aşağıdaki örnek, kitaplar hakkında bilgi depolayan basit bir uygulamadır. Yeni bir NestJS uygulaması oluşturmak için terminalinizde aşağıdaki komutu çalıştırın:

yeni yuva 

Oluşturulan uygulamanın dizinine gidin () ve bağımlılıklarını aşağıdaki komutla kurun:

$ npm kurulum --save @nestjs/config @nestjs/graphql grafikql-araçları grafikql \
 @nestjs/apollo apollo-server-express @nestjs/mongoose @types/graphql

GraphQL API'leri oluşturmak için iki ana yaklaşım vardır:

  1. Şema öncelikli yaklaşım: burada API'yi şema tanım dosyalarında veya SDL'de tanımlarsınız ve NestJS bunlara dayalı olarak TypeScript tanımları oluşturur.
  2. Kod öncelikli yaklaşım: TypeScript sınıflarını ve dekoratörlerini kullanarak sorguları, mutasyonları ve diğer GraphQL işlevlerini tanımladığınız ve NestJS'nin bunlara dayalı olarak SDL dosyaları oluşturduğu yer.

Aşağıdaki örnek, önce kod yaklaşımının nasıl kullanılacağını açıklar.

Öncelikle, GraphQL'i kendi cihazınızda başlatmanız gerekir. Uygulama Modülü Ve onu bir MongoDB veritabanına bağlayın:

// app.module.ts
içe aktarmak { Modül } itibaren"@nestjs/ortak";
içe aktarmak { GraphQLModülü gibi NestGraphQLModule } itibaren"@nestjs/graphql";
içe aktarmak { ApolloDriver, ApolloDriverConfig } itibaren"@nestjs/apollo";
içe aktarmak { katılmak } itibaren'yol';
içe aktarmak { Firavun Faresi Modülü } itibaren"@nestjs/firavun faresi";
içe aktarmak {Uygulama Denetleyicisi} itibaren'./app.controller';
içe aktarmak { Uygulama Hizmeti } itibaren'./uygulama.hizmet';
içe aktarmak { ConfigModule, ConfigService } itibaren"@nestjs/config";
içe aktarmak mongodbConfig itibaren'./config/mongodb.config';

@Modül({
ithalat: [
ConfigModule.forRoot({
yük: [mongodbConfig],
Global: doğru
}),
NestGraphQLModule.forRootAsync({
sürücü: ApolloDriver,
enjekte: [ConfigService],
kullanımFabrikası: zaman uyumsuz (configService: ConfigService) => ({
autoSchemaFile: birleştirme (process.cwd()), "kaynak/şema.gql"),
installSubscriptionHandlers: doğru,
sıralama Şeması: doğru,
oyun alanı: doğru,
hata ayıklama: configService.get<mantıksal>("HATA AYIKLAMA"),
yüklemeler: YANLIŞ,
}),
}),
MongooseModule.forRootAsync({
enjekte: [ConfigService],
kullanımFabrikası: zaman uyumsuz (configService: ConfigService) => ({
uri: configService.get("MONGO_URI")
})
}),
],
denetleyiciler: [AppController],
sağlayıcılar: [AppService],
})

ihracatsınıf Uygulama Modülü {}

Bu modül içe aktarır GraphQLModülü itibaren @nestjs/graphql ve Firavun Faresi Modülü itibaren @nestjs/firavun faresi bu da MongoDB'ye bağlanmaya yardımcı olur. bu otomatik Şema Dosyası özelliği, oluşturulan şema dosyasının konumunu belirtir ve sıralama şeması özelliği, alanları alfabetik olarak sıralamasını sağlar.

İşte MongoDB'niz yapılandırma dosya şöyle görünmelidir:

içe aktarmak { kayıt olarak } itibaren"@nestjs/config";

/**
 * Mongo veritabanı bağlantı yapılandırması
 */
ihracatvarsayılan Kayıt Ol('mongodb', () => {
sabit {
MONGO_URI
} = işlem.env;

geri dönmek {
uri: `${MONGO_URI}`,
};
});

GraphQL Şemasını Tanımlama

GraphQL ve MongoDB bağlantılarını kurduktan sonra, bir şema oluşturmak için GraphQL sorguları ve mutasyonları tanımlamalısınız (şema.gql) dosya.

Sorgu Yazma

İçinde kod öncelikli yaklaşımkullanarak bir model oluşturursunuz. Nesne türü dekoratör. Daha sonra bu modeli bir GraphQL tipine dönüştüreceksiniz.

Örneğin:

// kitap.model.ts
içe aktarmak { Alan, NesneTürü } itibaren"@nestjs/graphql";
içe aktarmak { Prop, Şema, SchemaFactory } itibaren"@nestjs/firavun faresi";
içe aktarmak { Belge } itibaren'firavun faresi';

ihracattip BookDocument = Kitap ve Belge;

@Nesne türü()
@Şema()
ihracatsınıf Kitap {
@Alan()
başlık: sicim;

@Alan()
yazar: sicim;

@Alan()
yayınlanma tarihi: mantıksal;
}

ihracatsabit BookSchema = SchemaFactory.createForClass (Kitap);

GraphQL varsayılan olarak oluşturulan şemaları kullanamaz. Bunları işlevsel hale getirmek için, GraphQL türlerini yürütmeye yönelik işlevleri içeren bir çözümleyici hizmetine ihtiyacınız vardır. ile yapabilirsiniz Çözücü dekoratör.

// kitaplar.çözücü.ts
içe aktarmak { Çözümleyici, Sorgu, Mutasyon, Bağımsız Değişkenler, Kimlik } itibaren"@nestjs/graphql";
içe aktarmak { Kitap } itibaren'./book.model';
içe aktarmak { Kitap Hizmeti } itibaren'./kitaplar.hizmet';

@Çözücü(() => Kitap)
ihracatsınıf Kitap Çözücü {
inşaatçı(özel salt okunur kitap Hizmeti: Kitap Hizmeti) { }

@Sorgu(() => [Kitap])
zaman uyumsuz kitabın(): Söz {
geri dönmekBu.bookService.findAll();
}

@Sorgu(() => Kitap)
zaman uyumsuz kitap(@Args('İD', { tip: () => Yaptım: sicim): Söz {
geri dönmekBu.bookService.findOne (id);
}
}

uygulayabilirsiniz Kitap Hizmeti,yukarıda içe aktarılan, aşağıdaki gibi:

// kitaplar.hizmet.ts
içe aktarmak { Enjekte edilebilir } itibaren"@nestjs/ortak";
içe aktarmak { Enjeksiyon Modeli } itibaren"@nestjs/firavun faresi";
içe aktarmak { Modeli } itibaren'firavun faresi';
içe aktarmak { Kitap, Kitap Belgesi } itibaren'./book.model';

@enjekte edilebilir()
ihracatsınıf Kitap Hizmeti {
inşaatçı(@InjectModel(Kitap.adı) özel kitapModel: Model) { }

zaman uyumsuz hepsini bul(): Söz {
geri dönmekBu.bookModel.find().exec();
}

zaman uyumsuz findOne (id: sicim): Söz {
geri dönmekBu.bookModel.findById (id).exec();
}
}

Ayrıca BookResolver'ı sağlayıcılar listesine eklemeniz gerekir. kitaplar.modül.ts.

içe aktarmak { Modül } itibaren"@nestjs/ortak";
içe aktarmak { Firavun Faresi Modülü } itibaren"@nestjs/firavun faresi";
içe aktarmak { Kitap Hizmeti } itibaren'./kitaplar.hizmet';
içe aktarmak { Kitap Çözücü } itibaren'./books.çözücü';
içe aktarmak { Kitap, Kitap Şeması } itibaren'./book.model';

@Modül({
sağlayıcılar: [
Kitap Hizmeti,
Kitap Çözücü
],
içe aktarmalar: [MongooseModule.forFeature([
{
ad: Kitap.adı,
şema: Kitap Şeması,
},
]),
],
})

ihracatsınıf Kitaplar Modülü {}

Mutasyonlarla Çalışmak

Siz GraphQL'de veri almak için bir sorgu kullandığınızda, mutasyonlar veri tabanında veri oluşturur veya günceller. Mutasyon oluşturmak için kullanıcılardan veri kabul etmeniz gerekir. bu Giriş tipi Bir sınıfı GraphQL giriş tipine dönüştüren dekoratör burada işe yarar.

// kitap.input.ts
içe aktarmak { GirişTürü, Alan } itibaren"@nestjs/graphql";

@Giriş tipi()
ihracatsınıf Kitap Girişi {
@Alan()
başlık: sicim;

@Alan()
yazar: sicim;

@Alan()
yayınlanma tarihi: mantıksal
}

Şimdi güncelleyebilirsiniz kitaplar.çözümleyici.ts şöyle görünmek için:

içe aktarmak { Çözümleyici, Sorgu, Mutasyon, Bağımsız Değişkenler, Kimlik } itibaren"@nestjs/graphql";
içe aktarmak { Kitap } itibaren'./book.model';
içe aktarmak { Kitap Hizmeti } itibaren'./kitaplar.hizmet';
içe aktarmak { Kitap Girişi } itibaren'./book.input';

@Çözücü(() => Kitap)
ihracatsınıf Kitap Çözücü {
inşaatçı(özel salt okunur kitap Hizmeti: Kitap Hizmeti) { }

@Mutasyon(() => Kitap)
zaman uyumsuz Kitap oluştur(@Args('giriş') girişi: BookInput): Söz {
geri dönmekBu.bookService.create (giriş);
}

@Mutasyon(() => Kitap)
zaman uyumsuz güncellemeKitabı(
@Args('İD', { tip: () => Yaptım: sicim,
@Args('giriş') giriş: Kitap Girişi,
): Söz {
geri dönmekBu.bookService.update (id, giriş);
}

@Mutasyon(() => Kitap)
zaman uyumsuz silKitap(@Args('İD', { tip: () => Yaptım: sicim): Söz {
geri dönmekBu.bookService.delete (id);
}
}

Ve kitaplar.hizmet.ts bunun gibi:

içe aktarmak { Enjekte edilebilir } itibaren"@nestjs/ortak";
içe aktarmak { Enjeksiyon Modeli } itibaren"@nestjs/firavun faresi";
içe aktarmak { Modeli } itibaren'firavun faresi';
içe aktarmak { Kitap, Kitap Belgesi } itibaren'./book.model';

@enjekte edilebilir()
ihracatsınıf Kitap Hizmeti {
inşaatçı(@InjectModel(Kitap.adı) özel kitapModel: Model) { }

zaman uyumsuz oluştur (kitap: Kitap): Söz {
sabit yeniKitap = yeniBu.bookModel (kitap);
geri dönmek yeniKitap.save();
}

zaman uyumsuz güncelleme (id: sicim, kitap: Kitap): Söz {
geri dönmekBu.bookModel.findByIdAndUpdate (id, kitap, { yeni: doğru }).exec();
}

zaman uyumsuzsilmek(İD: sicim): Söz {
geri dönmekBu.bookModel.findByIdAndDelete (id).exec();
}
}

bu @Mutasyon dekoratör, bir işlevi bir mutasyon türü olarak işaretler ve @Args dekoratör, işleve iletilen tüm girdileri alır.

Son olarak, içe aktarmalısınız BooksModül içine Uygulama Modülü işlevsel hale getirmek için. Ayrıca şunları da geçmelisiniz: BooksModül ile forRootAsync aşağıda görüldüğü gibi.

içe aktarmak { BooksModule } itibaren'./books/books.module';
/**
 * diğer ithalatlar
*/

@Modül({
ithalat: [
ConfigModule.forRoot({
yük: [mongodbConfig],
Global: doğru
}),
NestGraphQLModule.forRootAsync({
sürücü: ApolloDriver,
enjekte: [ConfigService],
kullanımFabrikası: zaman uyumsuz (configService: ConfigService) => ({
autoSchemaFile: birleştirme (process.cwd()), "kaynak/şema.gql"),
installSubscriptionHandlers: doğru,
sıralama Şeması: doğru,
oyun alanı: doğru,
hata ayıklama: configService.get<mantıksal>("HATA AYIKLAMA"),
yüklemeler: YANLIŞ,
}),
}),
MongooseModule.forRootAsync({
enjekte: [ConfigService],
kullanımFabrikası: zaman uyumsuz (configService: ConfigService) => ({
uri: configService.get("MONGO_URI")
})
}),
Kitaplar Modülü,
],
denetleyiciler: [AppController],
sağlayıcılar: [AppService],
})

ihracatsınıf Uygulama Modülü {}

Kodu çalıştırarak test edebilirsiniz. npm çalıştırma başlangıcı: dev terminalinizde ve uygulamanız bağlantı noktasında başarıyla başlamalıdır 3000.

Açık yerel ana bilgisayar: 3000/graphql göstermek için tarayıcınızda Graphiql sorguları ve mutasyonları test edebileceğiniz arayüz. İşte bir sorguyu gösteren bir örnek:

Ve işte bir mutasyon örneği:

NestJS ve GraphQL ile Verimli API'ler Oluşturun

Mongoose kullanarak NestJS'de MongoDB ile bir GraphQL API oluşturmak, GraphQL API için bir şema, bir şema tanımlamayı içerir. Mongoose modeli için, veritabanıyla etkileşime girecek bir hizmet ve GraphQL işlemlerini hizmete eşlemek için bir çözümleyici yöntemler.

NestJS, yolları tanımlamak için dekoratörler, onları korumak için korumalar ve istekleri ve yanıtları işlemek için ara yazılımlar dahil olmak üzere API'ler oluşturmak için yerleşik işlevlere sahiptir. Ayrıca PostgreSQL, MySQL ve SQLite gibi diğer veritabanlarının yanı sıra Apollo ve TypeGraphQL gibi diğer GraphQL kitaplıklarını da destekler.