GraphQL Subscriptions - kouzlo na serverech

Ahoj z jeskyně Dev! 🍻
Doufám, že jste v bezpečí a zdraví.

Tento je o tom, jak jsem implementoval systém upozornění v jednom ze svých projektů pomocí předplatného Apollo GraphQL.

Příklad, který zde použiji, je příklad projektu, který má 2 typy uživatelů – manažera a společníka a níže jsou 2 scénáře.

  • Jako správce a přihlášený uživatel

    • Chci dostávat upozornění, když můj spolupracovník vznese požadavek
    • Chci, aby můj spolupracovník – pokud je přihlášen – byl upozorněn, když na něj vznesu žádost.
  • Jako společník a přihlášený uživatel

    • Chci, aby můj manažer – pokud je přihlášen – byl upozorněn, když vznesu požadavek.
    • Chci dostávat upozornění, když na mě můj manažer vznese žádost.

Podívejme se, jak jsem to implementoval!

Některé věci na straně serveru

TypeDefs

Definujte typ Předplatné spolu se všemi požadovanými předplatnými.

Řešitelé

Stejně jako dotazy a mutace mají předplatné také resolver.

Zde je několik bodů -

  • Název překladače by se měl shodovat s názvem předplatného, ​​jako zde newRequestAdded. V tomto objektu budeme mít objekt odběru, kde definujete logiku, jaká data mají být vrácena.

  • Používám metodu withFilter, která mi pomáhá odfiltrovat data, která je třeba vrátit. Toto je nepovinné.

  • První parametr, který withFilter akceptuje, je funkce, kterou byste použili k registraci události. Předplatné zde funguje na konceptu PubSub nebo Publish-Subscribe, tj. definujete událost a registrujete ji.

    Jak jsme sem dostali tuto instanci pubsub, to popíšu v bodech níže. Jen je třeba zvážit, že každé předplatné má v celé aplikaci stejnou instanci pubsub a každý překladač předplatného musí vrátit asyncIterator s polem názvů událostí, aby tyto události zaregistroval a dostal se do ekosystému pubsub.

  • Druhým parametrem jsou funkce filtru, které vrátí hodnotu true, pokud jsou splněna kritéria a předplatné by mělo být odesláno klientovi. Tato funkce může být asynchronní podle vašich požadavků. V této funkci získáte

    • užitné zatížení, jehož hodnota je vyřešena pomocí nástroje na řešení mutací.
    • proměnné, tj. věci, které jste získali jako proměnnou předplatného
    • kontext, pokud se jej rozhodnete vložit při konfiguraci vašeho serveru Apollo pro předplatné.

Publikování události


Nejlepší způsob, jak vložit instanci pubsub, je prostřednictvím kontextu. Tímto způsobem můžete mít jedinou kopii a vyhnout se podivným pastím nebo situacím, jako jsou kruhové závislosti. Řekněme tedy, že jsem přidal nový požadavek do své DB a než jej vrátím z resolveru, použiji metodu publish na své instanci pubsub k odeslání této události s užitečným zatížením (zní to povědomě? REDUX - TADA! A proto jsem použil práci ekosystém nahoře! :D).
Bez ohledu na to, co předáváte, klíč by měl být stejný jako název předplatného – v tomto případě newRequestAdded a newRequest je objekt, který Mongo vrátil po uložení nového požadavku.

Nakonfigurujte instanci serveru Apollo.

Potřebujeme definovat pár věcí, které pomohou serveru Apollo v tom pokračovat. Začněme instalací závislosti.

Z toho importujte PubSub a vytvořte jeho instanci.
Jo jo, vím, že bych měl používat webpack a ES6+! Udělá to někdy o víkendu.

Musíme upravit konfiguraci našeho serveru. Kontext zde také poskytuje objekt připojení. Co musíme udělat, je zkontrolovat, že pokud získáme objekt připojení, můžete jej použít k zabezpečení aplikace tím, že z něj přistoupíte k hlavičkám API KEY a/nebo jej jednoduše vrátíte přímo pro překladače předplatného, ​​aby to zpracovali.

Jakmile je to hotovo, musíme definovat koncový bod.

Definujeme cestu – neboli koncový bod – který nakonfigurujeme v našem klientovi. Jen si pamatujte, že se jedná o funkci řízenou websocketem, a proto se změní náš protokol koncového bodu, tj. v mém případě to bude - ws://localhost:5000/subscriptions.

Tento konfigurační objekt nám také poskytuje 2 funkce onConnect, které můžete použít k vrácení parametrů připojení, tj. přijatých proměnných AND onDisconnect.

Jakmile je hotovo, zkuste to pomocí GraphiQL. To je veškerá konfigurace, kterou potřebujeme na straně serveru, zbytek je veškerá vaše logika.

Zkuste to a v příštím příspěvku si povíme o frontendu!

Na zdraví!