LoopBack Yapsın: Hayalini Kurduğunuz Düğüm API Çerçevesinin İzlenmesi

Yayınlanan: 2022-03-11

Uygulama geliştirme için Node.js'nin artan popülaritesinden bahsetmeye gerek yok. eBay, 2011'den beri bir üretim Düğümü API hizmeti çalıştırıyor. PayPal, Node.js'deki ön uçlarını aktif olarak yeniden inşa ediyor. Walmart'ın mobil sitesi, trafik açısından en büyük Node uygulaması haline geldi. 2014'teki Şükran Günü hafta sonu, Walmart sunucuları, yüzde 70'i mobil aracılığıyla teslim edilen ve Node.js tarafından desteklenen 1,5 milyar istek işledi. Geliştirme tarafında, Düğüm paket yöneticisi (npm) hızla büyümeye devam ediyor ve yakın zamanda barındırılan 150.000 modülü aştı.

Ruby'de Rails ve Python'da Django bulunurken, Node için baskın uygulama geliştirme çerçevesi henüz oluşturulmamıştır. Ancak, ivme kazanan güçlü bir rakip var: San Mateo, Kaliforniya, StrongLoop şirketi tarafından oluşturulan açık kaynaklı bir API çerçevesi olan LoopBack. StrongLoop, mevcut en popüler Düğüm çerçevelerinden biri olan Express'in uzun süredir koruyucularından bahsetmeye gerek yok, en son Düğüm sürümüne önemli bir katkıda bulunuyor.

Her şeyi pratiğe dönüştürerek ve örnek bir uygulama oluşturarak LoopBack'e ve yeteneklerine daha yakından bakalım.

LoopBack Nedir ve Node ile Nasıl Çalışır?

LoopBack, API'ler oluşturmak ve bunları arka uç veri kaynaklarıyla bağlamak için bir çerçevedir. Express'in üzerine inşa edilmiş olup, bir veri modeli tanımı alabilir ve herhangi bir istemci tarafından çağrılabilecek tamamen işlevsel bir uçtan uca REST API'sini kolayca oluşturabilir.

LoopBack, yerleşik bir istemci olan API Explorer ile birlikte gelir. Bunu, çalışmamızın sonuçlarını görmeyi kolaylaştırdığından ve örneğimizin API'nin kendisini oluşturmaya odaklanabilmesi için kullanacağız.

Elbette, takip etmek için makinenizde yüklü Node'a ihtiyacınız olacak. Buradan al. npm beraberinde gelir, böylece gerekli paketleri kolayca kurabilirsiniz. Başlayalım.

İskelet Oluştur

Uygulamamız, hediye veya artık ihtiyaç duymadığı şeyleri ihtiyacı olabilecek birine bağışlamak isteyen kişileri yönetecek. Böylece, kullanıcılar Donörler ve Alıcılar olacaktır. Bir Bağışçı yeni bir hediye oluşturabilir ve hediyelerin listesini görebilir. Bir Alıcı, tüm kullanıcılardan gelen hediyelerin listesini görebilir ve talep edilmeyenleri talep edebilir. Tabii ki, aynı varlık (Kullanıcı) üzerinde ayrı roller olarak Donörler ve Alıcılar oluşturabiliriz, ancak LoopBack'te ilişkilerin nasıl kurulacağını görebilmemiz için onları ayırmayı deneyelim. Bu çığır açan uygulamanın adı Givesomebody olacak.

StrongLoop komut satırı araçlarını npm aracılığıyla yükleyin:

 $ npm install -g strongloop

Ardından LoopBack'in uygulama oluşturucusunu çalıştırın:

 $ slc loopback _-----_ | | .--------------------------. |--(o)--| | Let's create a LoopBack | `--------- | application! | ( _U`_ ) '--------------------------' /___A___\ | ~ | __'.___.'__ ` |° Y ` ? What's the name of your application? Givesomebody

Bir model ekleyelim. İlk modelimizin adı Gift olacak. LoopBack, veri kaynağını ve temel sınıfı soracaktır. Henüz veri kaynağını kurmadığımız için db (memory) koyabiliriz. Temel sınıf, otomatik olarak oluşturulan bir model sınıfıdır ve bu durumda bizim için tüm olağan CRUD yöntemlerini içerdiğinden PersistedModel kullanmak istiyoruz. Ardından, LoopBack, modeli REST (evet) ve REST hizmetinin adı aracılığıyla açığa çıkarması gerekip gerekmediğini sorar. Model adının çoğulu olan varsayılanı kullanmak için buraya enter tuşuna basın (bizim durumumuzda, gifts ).

 $ slc loopback:model ? Enter the model name: Gift ? Select the data-source to attach Gift to: (Use arrow keys) ❯ db (memory) ? Select model's base class: (Use arrow keys) Model ❯ PersistedModel ? Expose Gift via the REST API? (Y/n) Yes ? Custom plural form (used to build REST URL):

Son olarak, özelliklerin adlarını, veri türlerini ve gerekli/gerekli olmayan bayraklarını veriyoruz. Hediyenin name ve description özellikleri olacaktır:

 Let's add some Gift properties now. Enter an empty property name when done. ? Property name: name invoke loopback:property ? Property type: (Use arrow keys) ❯ string ? Required? (y/N)Yes

Özellikleri tanımlamayı tamamladığınızı belirtmek için boş bir özellik adı girin.

Model oluşturucu, uygulamanın common/models modeli tanımlayan iki dosya oluşturacaktır: gift.json ve gift.js JSON dosyası, varlık hakkındaki tüm meta verileri belirtir: özellikler, ilişkiler, doğrulamalar, roller ve yöntem adları. JavaScript dosyası, ek davranışı tanımlamak ve belirli işlemlerden (örneğin, oluşturma, güncelleme veya silme) önce veya sonra çağrılacak uzak kancaları belirtmek için kullanılır.

Diğer iki model varlık, Donör ve Alıcı modellerimiz olacaktır. Bunları aynı işlemi kullanarak oluşturabiliriz, ancak bu sefer User temel sınıf olarak koyalım. Bize username , password , email gibi bazı özellikleri kutudan çıkaracak. Örneğin tam bir varlığa sahip olmak için sadece isim ve ülke ekleyebiliriz. Alıcı için teslimat adresini de eklemek istiyoruz.

Proje Yapısı

Oluşturulan proje yapısına bir göz atalım:

proje yapısı

Üç ana dizin şunlardır: - /server – Düğüm uygulama komut dosyalarını ve yapılandırma dosyalarını içerir. - /client – ​​.js, .html, .css ve diğer tüm statik dosyaları içerir. - /common – Bu klasör hem sunucu hem de istemci için ortaktır. Model dosyaları buraya gelir.

LoopBack belgelerinden alınan her dizinin içeriğinin ayrıntılı bir dökümü burada:

Dosya veya dizin Tanım Kodda nasıl erişilir
Üst düzey uygulama dizini
package.json Standart npm paketi belirtimi. package.json'a bakın Yok
/server dizini - Düğüm uygulama dosyaları
server.js Ana uygulama programı dosyası. Yok
config.json Uygulama ayarları. config.json'a bakın. app.get('setting-name')
datasources.json Veri kaynağı yapılandırma dosyası. datasources.json'a bakın. Bir örnek için bkz. Yeni veri kaynağı oluşturma . app.datasources['datasource-name']
model-config.json Model yapılandırma dosyası. model-config.json'a bakın. Daha fazla bilgi için, bkz Modelleri veri kaynaklarına bağlama . Yok
middleware.json Middleware tanım dosyası. Daha fazla bilgi için, bkz. Ara yazılımı tanımlama. Yok
/boot dizini Başlatma ve kurulum gerçekleştirmek için komut dosyaları ekleyin. Önyükleme komut dosyalarına bakın. Komut dosyaları alfabetik sırayla otomatik olarak yürütülür.
/client dizini - istemci uygulama dosyaları
README.md LoopBack oluşturucular, markdown formatında boş BENİOKU dosyası oluşturur. Yok
Diğer HTML, CSS, istemci JavaScript dosyalarınızı ekleyin.
/ortak dizin - paylaşılan uygulama dosyaları
/models dizini Özel model dosyaları:
  • Model model-name .json adlı kurala göre model tanımı JSON dosyaları; örneğin customer.json .
  • model-name .js adlı kurala göre özel model komut dosyaları; örneğin, customer.js .
Daha fazla bilgi için, bkz. Model tanımı JSON dosyası ve Modelleri özelleştirme.
düğüm:
myModel = app.models.myModelName

İlişki kurmak

Örneğimizde, modellemek için birkaç önemli ilişkimiz var. Bir Donör birçok Hediye bağışlayabilir, bu da Donörün birçok Hediyesi olduğu ilişkisini verir. Bir Alıcı ayrıca birçok Hediye alabilir, bu nedenle Alıcının birçok Hediyesi vardır ilişkimiz de vardır. Öte yandan Hediye, Donör'e aittir ve Alıcı kabul etmeyi seçerse, Alıcı'ya da ait olabilir. Bunu LoopBack diline koyalım.

 $ slc loopback:relation ? Select the model to create the relationship from: Donor ? Relation type: has many ? Choose a model to create a relationship with: Gift ? Enter the property name for the relation: gifts ? Optionally enter a custom foreign key: ? Require a through model? No

Model üzerinden olmadığını unutmayın; Biz sadece Hediyeye atıfta bulunuyoruz.

Yukarıdaki işlemi Receiver için tekrarlar ve Gift'e iki adet ilişki eklersek model tasarımımızı back end tarafında gerçekleştirmiş oluruz. LoopBack, bu basit diyaloglar aracılığıyla az önce yaptığımız şeyi tam olarak ifade etmek için modeller için JSON dosyalarını otomatik olarak günceller:

 // common/models/donor.json ... "relations": { "gifts": { "type": "hasMany", "model": "Gift", "foreignKey": "" } }, ...

Veri Kaynağı Ekle

Şimdi tüm uygulama verilerimizi depolamak için gerçek bir veri kaynağının nasıl ekleneceğini görelim. Bu örneğin amaçları için MongoDB kullanacağız, ancak LoopBack, Oracle, MySQL, PostgreSQL, Redis ve SQL Server ile bağlantı kurmak için modüllere sahiptir.

İlk önce, konektörü kurun:

 $ npm install --save loopback-connector-mongodb

Ardından projenize bir veri kaynağı ekleyin:

 $ slc loopback:datasource ? Enter the data-source name: givesomebody ? Select the connector for givesomebody: MongoDB (supported by StrongLoop)

Sonraki adım, veri kaynağınızı server/datasources.json içinde yapılandırmaktır. Yerel bir MongoDB sunucusu için bu yapılandırmayı kullanın:

 ... "givesomebody": { "name": "givesomebody", "connector": "mongodb", "host": "localhost", "port": 27017, "database": "givesomebody", "username": "", "password": "" } ...

Son olarak, server/model-config.json dosyasını açın ve veritabanında kalıcı olmasını istediğimiz tüm varlıklar için datasource "givesomebody" olarak değiştirin.

 { ... "User": { "dataSource": "givesomebody" }, "AccessToken": { "dataSource": "givesomebody", "public": false }, "ACL": { "dataSource": "givesomebody", "public": false }, "RoleMapping": { "dataSource": "givesomebody", "public": false }, "Role": { "dataSource": "givesomebody", "public": false }, "Gift": { "dataSource": "givesomebody", "public": true }, "Donor": { "dataSource": "givesomebody", "public": true }, "Receiver": { "dataSource": "givesomebody", "public": true } }

REST API'nizi Test Etme

Şimdiye kadar ne inşa ettiğimizi görmenin zamanı geldi! Yeni oluşturduğumuz hizmet için istemci olarak kullanılabilecek harika yerleşik araç olan API Explorer'ı kullanacağız. REST API çağrılarını test etmeyi deneyelim.

Ayrı bir pencerede MongoDB'yi şununla başlatın:

 $ mongod

Uygulamayı şununla çalıştırın:

 $ node .

Tarayıcınızda http://localhost:3000/explorer/ adresine gidin. Mevcut işlem listesi ile varlıklarınızı görebilirsiniz. POST /Donors çağrısıyla bir Donör eklemeyi deneyin.

API 2'nizi test etme

API 3'ünüzü test etme

API Explorer çok sezgiseldir; maruz kalan yöntemlerden herhangi birini seçin ve ilgili model şeması sağ alt köşede görüntülenecektir. data metni alanında özel bir HTTP isteği yazmak mümkündür. İstek doldurulduktan sonra “Dene” düğmesine tıklayın, sunucunun yanıtı aşağıda görüntülenecektir.

API 1'inizi test etme

Kullanıcı doğrulama

Yukarıda bahsedildiği gibi, LoopBack ile önceden oluşturulmuş olarak gelen varlıklardan biri User sınıfıdır. Kullanıcı, oturum açma ve oturum kapatma yöntemlerine sahiptir ve belirli bir kullanıcının belirtecini tutan bir AccessToken varlığına bağlanabilir. Aslında, eksiksiz bir kullanıcı kimlik doğrulama sistemi kutudan çıkmaya hazırdır. API Explorer üzerinden /Donors/login çağırmayı denersek, aldığımız yanıt şudur:

 { "id": "9Kvp4zc0rTrH7IMMeRGwTNc6IqNxpVfv7D17DEcHHsgcAf9Z36A3CnPpZJ1iGrMS", "ttl": 1209600, "created": "2015-05-26T01:24:41.561Z", "userId": "" }

id , aslında veritabanında otomatik olarak oluşturulan ve kalıcı olan AccessToken'ın değeridir. Burada gördüğünüz gibi, bir erişim belirteci ayarlamak ve sonraki her istek için kullanmak mümkündür.

Kullanıcı doğrulama

Uzak Yöntemler

Uzak yöntem, özel bir REST uç noktası üzerinden sunulan bir modelin statik yöntemidir. LoopBack'in standart model REST API'si tarafından sağlanmayan işlemleri gerçekleştirmek için uzak yöntemler kullanılabilir.

Kutudan çıkardığımız CRUD yöntemlerinin yanı sıra istediğimiz kadar özel yöntem ekleyebiliriz. Hepsi [model].js dosyasına girmelidir. Bizim durumumuzda, hediyenin önceden rezerve edilip edilmediğini kontrol etmek için Gift modeline bir uzak yöntem ve ayrılmamış tüm hediyeleri listelemek için bir tane ekleyelim.

İlk olarak, modele Reserve adlı bir ek özellik reserved . Bunu gift.json özelliklere eklemeniz yeterlidir:

 ... "reserved": { "type": "boolean" } ...

gift.js uzak yöntem şöyle görünmelidir:

 module.exports = function(Gift) { // method which lists all free gifts Gift.listFree = function(cb) { Gift.find({ fields: { reserved: false } }, cb); }; // expose the above method through the REST Gift.remoteMethod('listFree', { returns: { arg: 'gifts', type: 'array' }, http: { path: '/list-free', verb: 'get' } }); // method to return if the gift is free Gift.isFree = function(id, cb) { var response; Gift.find({ fields: { id: id } }, function(err, gift) { if (err) return cb(err); if (gift.reserved) response = 'Sorry, the gift is reserved'; else response = 'Great, this gift can be yours'; }); cb(null, response); }; // expose the method through REST Gift.remoteMethod('isFree', { accepts: { arg: 'id', type: 'number' }, returns: { arg: 'response', type: 'string' }, http: { path: '/free', verb: 'post' } }); };

Bu nedenle, belirli bir hediyenin mevcut olup olmadığını öğrenmek için müşteri artık /api/Gifts/free 'a söz konusu hediyenin id ileterek bir POST isteği gönderebilir.

Uzak Kancalar

Bazen uzak yöntemden önce veya sonra bazı yöntemlerin yürütülmesine ihtiyaç duyulur. İki tür uzak kanca tanımlayabilirsiniz:

  • beforeRemote() , uzak yöntemden önce çalışır.
  • afterRemote() , uzak yöntemden sonra çalışır.

Her iki durumda da iki bağımsız değişken sağlarsınız: işlevinizi "bağlamak" istediğiniz uzak yöntemle eşleşen bir dize ve geri arama işlevi. Uzak kancaların gücünün çoğu, dizenin joker karakterler içerebilmesidir, bu nedenle herhangi bir eşleştirme yöntemiyle tetiklenir.

Bizim durumumuzda, yeni bir Donör oluşturulduğunda konsola bilgi yazdırmak için bir kanca ayarlayalım. Bunu başarmak için donor.js "oluşturmadan önce" bir kanca ekleyelim:

 module.exports = function(Donor) { Donor.beforeRemote('create', function(context, donor, next) { console.log('Saving new donor with name: ', context.req.body.name); next(); }); };

İstek, verilen context çağrılır ve ara katman yazılımındaki (aşağıda tartışılan next() geri çağrısı, kanca çalıştıktan sonra çağrılır.

Erişim Kontrolleri

LoopBack uygulamaları, verilere modeller aracılığıyla erişir, bu nedenle verilere erişimin kontrol edilmesi, modellerde kısıtlamaların tanımlanması anlamına gelir; yani, kimin veya neyin verileri okuyup yazabileceğini veya modellerde yöntemleri uygulayabileceğini belirtmek. LoopBack erişim kontrolleri, erişim kontrol listeleri veya ACL'ler tarafından belirlenir.

Giriş yapmamış Bağışçıların ve Alıcıların hediyeleri görmelerine izin verelim, ancak yalnızca giriş yapmış Bağışçıların onları oluşturmasına ve silmesine izin verelim.

 $ slc loopback:acl

Başlamak için, herkesin tüm uç noktalara erişimini reddedelim.

 ? Select the model to apply the ACL entry to: Gift ? Select the ACL scope: All methods and properties ? Select the access type: All (match all types) ? Select the role: All users ? Select the permission to apply: Explicitly deny access

Ardından, herkesin Hediye modellerinden okumasına izin verin:

 $ slc loopback:acl ? Select the model to apply the ACL entry to: Gift ? Select the ACL scope: All methods and properties ? Select the access type: Read ? Select the role: All users ? Select the permission to apply: Explicitly grant access

Ardından, kimliği doğrulanmış kullanıcıların Hediyeler oluşturmasına izin vermek istiyoruz:

 $ slc loopback:acl ? Select the model to apply the ACL entry to: Gift ? Select the ACL scope: A single method ? Enter the method name: create ? Select the role: Any authenticated user ? Select the permission to apply: Explicitly grant access

Ve son olarak, hediyenin sahibinin herhangi bir değişiklik yapmasına izin verelim:

 $ slc loopback:acl ? Select the model to apply the ACL entry to: Gift ? Select the ACL scope: All methods and properties ? Select the access type: Write ? Select the role: The user owning the object ? Select the permission to apply: Explicitly grant access

Şimdi gift.json her şey yerli yerinde olmalı:

 "acls": [ { "accessType": "*", "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" }, { "accessType": "READ", "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW" }, { "accessType": "EXECUTE", "principalType": "ROLE", "principalId": "$authenticated", "permission": "ALLOW", "property": "create" } ],

Burada önemli bir not: $authenticated , sistemdeki tüm kullanıcılara (hem Bağışçılar hem de Alıcılar) karşılık gelen önceden tanımlanmış bir roldür, ancak yalnızca Bağışçıların yeni Hediyeler oluşturmasına izin vermek istiyoruz. Bu nedenle, özel bir role ihtiyacımız var. Rol, kutudan çıkardığımız bir varlık daha olduğundan, önyükleme işlevinde $authenticatedDonor rolünü oluşturmak için API çağrısından yararlanabilir ve ardından pricipalId gift.json içinde değiştirebiliriz.

Yeni bir dosya, server/boot/script.js oluşturmak ve aşağıdaki kodu eklemek gerekecektir:

 Role.create({ name: 'authenticatedDonor' }, function(err, role) { if (err) return debug(err); })

RoleMapping varlığı, Rolleri Kullanıcılarla eşler. Role ve RoleMapping'in her ikisinin de REST aracılığıyla açığa çıktığından emin olun. server/model-config.json içinde, "public" öğesinin Role varlığı için true olarak ayarlandığını kontrol edin. Daha sonra donor.js , RoleMapping POST API çağrısında userID ve roleID bir "oluşturmadan önce" kancası yazabiliriz.

ara katman yazılımı

Ara yazılım, REST uç noktasına bir istek yapıldığında yürütülen işlevleri içerir. LoopBack, Express'i temel aldığından, "ara katman yazılımı aşamaları" adı verilen ek bir konseptle Express ara katman yazılımını kullanır. Fazlar, ara katman yazılımındaki işlevlerin çağrıldığı sırayı açıkça tanımlamak için kullanılır.

LoopBack belgelerinde sağlanan önceden tanımlanmış aşamaların listesi:

  1. ilk - Ara yazılımın çalışabileceği ilk nokta.
  2. session - Oturum nesnesini hazırlayın.
  3. auth - Kimlik doğrulama ve yetkilendirmeyi yönetin.
  4. ayrıştırma - İstek gövdesini ayrıştırın.
  5. rotalar - uygulama mantığınızı uygulayan HTTP yolları. Express API app.use, app.route, app.get (ve diğer HTTP fiilleri) aracılığıyla kaydedilen ara yazılım, bu aşamanın başında çalışır. Bu aşamayı geridöngü/sunucu/ara yazılım/dinlenme veya geridöngü-kaşif gibi alt uygulamalar için de kullanın.
  6. dosyalar - Statik varlıkları sunun (burada istekler dosya sistemine çarpıyor).
  7. final - Bilinmeyen URL'ler için hatalar ve isteklerle ilgilenin.

Her fazın üç alt fazı vardır. Örneğin, başlangıç ​​aşamasının alt aşamaları şunlardır:

  1. başlangıç:önce
  2. ilk
  3. başlangıç:sonra

Varsayılan ara katman yazılımımız.json'a hızlıca bir göz atalım:

 { "initial:before": { "loopback#favicon": {} }, "initial": { "compression": {}, "cors": { "params": { "origin": true, "credentials": true, "maxAge": 86400 } } }, "session": { }, "auth": { }, "parse": { }, "routes": { }, "files": { }, "final": { "loopback#urlNotFound": {} }, "final:after": { "errorhandler": {} } }

İlk aşamada, loopback.favicon() 'u çağırırız ( loopback#favicon , bu çağrı için ara katman kimliğidir). Ardından, üçüncü taraf npm modülleri compression ve cors çağrılır (parametreli veya parametresiz). Son aşamada, iki çağrımız daha var. urlNotFound bir LoopBack çağrısıdır ve errorhandler üçüncü taraf modülüdür. Bu örnek, harici npm modülleri gibi birçok yerleşik çağrının kullanılabileceğini göstermelidir. Ve elbette, her zaman kendi ara katman yazılımımızı oluşturabilir ve onları bu JSON dosyası aracılığıyla çağırabiliriz.

loopback-boot

Özetlemek gerekirse, uygulamayı başlatan boot() işlevini dışa aktaran bir modülden bahsedelim. server/server.js , uygulamayı önyükleyen aşağıdaki kod parçasını bulacaksınız:

 boot(app, __dirname, function(err) { if (err) throw err; // start the server if `$ node server.js` if (require.main === module) app.start(); });

Bu komut dosyası, server/boot klasörünü arayacak ve orada bulduğu tüm komut dosyalarını alfabetik sırayla yükleyecektir. Böylece server/boot içinde başlangıçta çalıştırılması gereken herhangi bir betiği belirtebiliriz. Bir örnek, API'mizi test etmek için kullandığımız istemci olan API Explorer'ı çalıştıran explorer.js .

Tekrarlama blues var mı? Bu Düğüm API'sini tekrar sıfırdan oluşturmayın. LoopBack'in yapmasına izin verin!
Cıvıldamak

Çözüm

Sizden ayrılmadan önce, slc komut satırı araçlarına alternatif olarak kullanılabilecek bir grafik UI olan StrongLoop Arc'tan bahsetmek istiyorum. Ayrıca Düğüm uygulamaları oluşturmak, profil oluşturmak ve izlemek için araçlar içerir. Komut satırının hayranı olmayanlar için bu kesinlikle denemeye değer. Ancak StrongLoop Arc kullanımdan kaldırılmak üzere ve işlevselliği IBM API Connect Developer Toolkit ile bütünleştiriliyor.

Çözüm

Genel olarak konuşursak, LoopBack, kutudan çok fazla şey aldığınız için sizi çok fazla manuel çalışmadan kurtarabilir. Uygulamaya özel sorunlara ve iş mantığına odaklanmanızı sağlar. Uygulamanız CRUD işlemlerine ve önceden tanımlanmış varlıkları manipüle etmeye dayanıyorsa, tonlarca geliştirici sizden önce yazdığında kullanıcının kimlik doğrulama ve yetkilendirme altyapısını yeniden yazmaktan bıktıysanız veya aşağıdaki gibi harika bir web çerçevesinin tüm avantajlarından yararlanmak istiyorsanız, Express, ardından LoopBack ile REST API'nizi oluşturmak hayallerinizi gerçekleştirebilir. Bu bir parça kek!