Fermer

avril 17, 2018

Premiers pas avec Kinvey FlexServices


Découvrez comment créer des fonctions pouvant être utilisées en tant que points de terminaison personnalisés ou crochets de collection. Nous verrons comment démarrer en utilisant FlexService Runtime, puis explorer quelques exemples de fonctions Flex pour voir comment elles sont construites.

«Ne faites pas attention à l'homme derrière le rideau», dit l'une des plus célèbres citations du magicien d'Oz. C'est aussi ce que j'ai ressenti à propos de nombreuses applications logicielles que j'ai construites au cours de ma carrière. Bien sûr, tout a fonctionné, mais s'il vous plaît ne regardez pas le code!

Lorsque vous combinez des systèmes disparates pour construire une application complexe, parfois des compromis finissent par être faits. Cependant, le rideau toujours est finalement retiré – habituellement quand moi ou un de mes collègues devions maintenir l'application. C'est à ce moment que le coût de ces compromis devient finalement clair. Ce code pour intégrer une API tierce qui a été regroupée ici doit maintenant fonctionner également, mais il n'a jamais été écrit pour faciliter sa réutilisation. ?

L'un des avantages de la logique métier dans le cloud est qu'elle peut permettre le développement d'une architecture de microservices de composants faiblement couplés et réutilisables . Kinvey propose plusieurs méthodes pour ce faire, mais de loin le plus puissant est FlexServices combiné avec le Flex SDK et FlexService Runtime . 19659006] En utilisant FlexServices, je peux créer des fonctions contenant une logique métier et des intégrations d'API tierces ou me lier à des systèmes d'authentification ou à des intégrations de données qui seraient autrement impossibles via des intégrations prêtes à l'emploi. Ces derniers peuvent être activés pour être réutilisés de différentes manières, notamment en tant que points de terminaison personnalisés pouvant être appelés directement ou en tant que points de collecte appelés lorsque les données sont mises à jour ou récupérées. Un FlexService peut également devenir le système d'enregistrement des données dans une collection Kinvey ou pour l'authentification en utilisant Mobile Identity Connect .

Évidemment, il y a beaucoup de choses à couvrir ici. Pour cet article, je vais me concentrer sur la construction de fonctions qui peuvent être utilisées en tant que points de terminaison personnalisés ou crochets de collection. Nous verrons comment démarrer en utilisant FlexService Runtime, puis explorerons quelques exemples de fonctions Flex pour voir comment ils sont construits.

Table des matières

Getting Up

FlexServices s'exécuter sur une exécution Node.js. Pour les créer et les tester localement, vous aurez besoin de Node.js (et de npm, qui est généralement inclus dans l'installation de Node.js) installé sur votre système. Vous pouvez trouver les instructions d'installation ici . Il convient de noter que FlexService Runtime exécute actuellement NTS v6 LTS.

En supposant que Node.js soit installé, la première chose à faire pour travailler avec FlexServices est d'installer l'interface CLI de Kinvey.

 npm install -g kinvey-cli 

Vous pouvez voir la liste complète des commandes CLI de Kinvey en entrant:

 kinvey flex -h 

En supposant que la CLI fonctionne correctement , créons un nouveau FlexService.

Créer un nouveau projet

Les FlexServices sont tous construits en utilisant JavaScript et Node.js. Voici les étapes pour démarrer un nouveau projet:

  1. Initialiser le projet en utilisant npm

    Cela pose une série de questions avant de générer le package.json -les défauts sont corrects, mais n'hésitez pas à mettez tout ce que vous voulez ou exécutez npm init -y afin d'utiliser les valeurs par défaut sans y être invité

  2. Installez la dernière version du Flex SDK et ajoutez-la à votre package.json avec le modificateur – save

     npm install kinvey-flex-sdk --save 

  3. Créez le fichier index.js – ce sera le point d'entrée de votre FlexService. Ajoutez le code suivant:

     const sdk = require ('kinvey-flex-sdk'); sdk.service ((err, flex) => {}); 

    Effectivement, c'est la plaque de base sur laquelle nous allons créer notre FlexService.

  4. Ecrire une fonction. Commençons simplement. Cette fonction renvoie juste une réponse statique avec une propriété de message

     function darthVaderQuotes (context, complete, modules) {complete (). SetBody ({message: 'Je ressens quelque chose Une présence que je n'ai pas ressenti depuis ...'} ).terminé(); } 

    Note: Les contextes et modules ne sont pas nécessaires pour cette fonction car ils ne sont pas utilisés, mais je les inclut par exemple comme vous le feriez normalement besoin et les utiliser.

  5. Enregistrer la fonction.

     flex.functions.register ('darthVaderQuotes', darthVaderQuotes); 

    Note: Dans la plupart des cas vous attribueriez réellement flex.functions à une constante, car vous devrez le référencer pour chaque fonction que vous enregistrez, mais, dans cet exemple, nous n'enregistrons que celui-là. En outre, il est recommandé de placer généralement les gestionnaires dans un fichier séparé pour faciliter la lecture et la maintenance de FlexService. Vous verrez ceci fait dans les exemples suivants discutés ci-dessous.

  6. Testez le service localement. Commencez par utiliser le noeud . . Pour le tester, effectuez un POST sur http: // localhost: 10001 / _flexFunctions / darthVaderQuotes . Un outil comme Postman peut aider avec ceci.

     postier "data-displaymode =" Original "title =" postier "/></p data-recalc-dims=

Déployer un FlexService

Maintenant que nous connaissons notre service FlexService , déployons-le.

  1. Dans la Console Kinvey choisissez l'onglet "Catalogue de services" en haut de la page puis cliquez sur le bouton "Ajouter un Service" sur le côté droit de la page.

     add-service "data-displaymode =" Original "title =" add-service "/></p data-recalc-dims=

  2. Choisissez l'option" Flex "puis" Flex Services Runtime ".

     add-service-flex" data-displaymode = "Original" title = "add-service-flex" /></p data-recalc-dims=

  3. Remplissez le formulaire en donnant un nom au nom du service, champ d'application (dans ce cas, il suffit de l'ajouter à une application existante, mais si vous ne le faites pas avoir une application encore, vous devrez en créer un d'abord), et secret.Le nom et le secret peuvent être quelque chose que vous aimez.Enregistrer le service.

     nouveau-service-formulaire "data-displaymode =" Original "title = "new-service-form" /></p data-recalc-dims=

    Note: Pour de futures références nce, le secret offre une couche de sécurité supplémentaire lors de l'appel du FlexService, cependant, pour notre exemple simple, ce n'est pas nécessaire.

  4. De retour dans l'invite Terminal / Commande, entrez kinvey flex init pour connecter votre FlexService Kinvey local avec le service que nous venons de créer dans la console Web. Cela va passer par plusieurs invites pour choisir votre application, puis le service correct. Lorsque cela est fait, déployez votre application avec la commande kinvey flex deploy

     flex-service-init "data-displaymode =" Original "title =" flex-service-init "/></p data-recalc-dims=

  5. ] Pour vérifier l'état de votre déploiement, vous pouvez utiliser kinvey flex status Une fois le déploiement terminé, il doit indiquer "status: ONLINE"

     flex-status "data-displaymode =" Original "title =" flex-status "/></p data-recalc-dims=

  6. Puisqu'il s'agit d'une fonction simple qui ne fait que renvoyer un message, nous allons le configurer comme un point de terminaison personnalisé . Pour ce faire, accédez à l'onglet "Applications" dans la console Kinvey et choisissez l'application et l'environnement auxquels vous souhaitez ajouter le point de terminaison, puis accédez à "Points de terminaison personnalisés" et cliquez sur "Ajouter un point de terminaison."

     -endpoints "data-displaymode =" Original "title =" custom-endpoints "/></p data-recalc-dims=

  7. Attribuez un nom au noeud final et choisissez l'option" Microservice "

     create-endpoint-step1" data-displaymode = "Original "title =" create-endpoint-step1 "/></p data-recalc-dims=

    Sélectionnez ensuite le service et le gestionnaire corrects dans les options (il ne devrait y avoir qu'une seule option de gestionnaire dans la liste déroulante pour le service, puisque nous avons créé une seule fonction).

     create-endpoint-step2 "data-displaymode =" Original "title =" create-endpoint-step2 "/></p data-recalc-dims=

  8. Pour tester notre point de terminaison, accédez à la console API, choisissez" POST "comme méthode et sélectionnez votre endpoint dans la liste des endpoints disponibles.

     test-endpoint-step1 "data-displaymode =" Original "title =" test-endpoint-step1 "/></p data-recalc-dims=

    Après en cliquant sur "Envoyer", les détails de la demande et la réponse sont affichés

     test-endpoint-step2 "data-displaymode =" Original "title =" test-endpoint-step2 "/></p data-recalc-dims=

Yay ! Nous avons déployé notre premier FlexService! ?

Mais ça ne sert vraiment à rien. ?

Maintenant que nous avons couvert les bases, voyons comment nous pourrions construire quelque chose qui soit réellement utile.

Exemples FlexService

Pour vous aider à commencer à explorer ce que FlexServices peut faire pour votre application, j'ai construit une série d'exemples et les a postés à GitHub . Jetons un coup d'œil à chacun d'entre eux et à certains des concepts qu'ils démontrent.

Moderate Text FlexService

Voir sur GitHub

Ce FlexService est conçu pour servir d'exemple simple d'intégration une de l'énorme bibliothèque de paquets npm . Dans ce cas, il utilise une bibliothèque npm appelée bad-words qui est conçue pour filtrer ou identifier un langage incorrect dans le texte.

Utiliser des paquets npm

Utiliser une bibliothèque comme de mauvais mots votre FlexService, d'abord vous devez l'installer et l'ajouter à votre package.json :

 npm installer bad-words --save 

Pour le rendre disponible dans le fichier JavaScript, vous devez require it:

 const Filter = require ('bad-words'); 

Après cela, nous utilisons simplement la bibliothèque comme dans n'importe quelle autre application Node.js.

 const filter = nouveau Filtre (); return filters.isProfaneLike (text); 

FlexServices en tant que Hooks de collection

Les fonctions d'un FlexService peuvent être déployées en tant que collections hooks leur permettant de modifier, filtrer, nettoyer ou utiliser des données telles qu'elles sont être récupéré, sauvegardé ou supprimé dans une collection Kinvey. Puisque notre fonction modère le texte, on pourrait imaginer que vous vouliez nettoyer un message avant qu'il ne soit inséré comme commentaire, par exemple.

Pour ajouter une méthode FlexService qui a été déployée en tant que hook de collection, allez dans "Collection Hooks". "dans la console Web de Kinvey, puis cliquez sur" Ajouter un crochet. "

Choisissez la collection à laquelle vous souhaitez ajouter un crochet.

 add-hook" data-displaymode = "Original" title = "add-hook" /></p data-recalc-dims=

Choisissez l'un des hooks pré ou post disponibles.

 choose-hook "data-displaymode =" Original "title =" select-hook "/></p data-recalc-dims=

Sélectionnez "Microservice" et cliquez sur le bouton "Create Collection Hook". Sur l'écran suivant, trouvez le service et sélectionnez la méthode

 choose-method "data-displaymode =" Original "title =" choose-method "/></p data-recalc-dims=

Une chose à garder à l'esprit est que une méthode hook de collection devra définir le corps de la requête si elle a l'intention de faire des changements dans les données transmises ou non.

 return complete () .setBody (résultat) .created () .ok (). next (); 

Email Confirmation FlexService

Voir sur GitHub

Ce FlexService est un exemple de comment envoyer un email de confirmation quand une personne s'inscrit à une liste de diffusion ou souscription Il y a trois types de courriels qu'il enverra selon le type d'abonnement: un nouvel abonnement, un utilisateur existant qui a changé son statut d'abonnement pour s'abonner et, enfin, un utilisateur qui s'est désabonné.

accomplir cette tâche, il y a deux fonctions conçues pour être utilisées comme une série de crochets de collection . Les hooks sont des fonctions qui s'exécutent avant ou après l'enregistrement ou la récupération des données d'une collection Kinvey. Dans de nombreux cas, ceux-ci modifient ou massent les données d'une certaine manière, mais dans ce cas, la fonction vérifie uniquement leur statut d'abonnement existant pendant le hook de collection onPreSave puis envoie l'e-mail approprié dans onPostSave collection hook, une fois que l'enregistrement a été traité dans la collection Kinvey

The Temporary Object Store

Les deux fonctions qui composent ce FlexService ont besoin d'un moyen de communiquer entre elles. Dans ce scénario, le hook onPreSave devait informer le hook onPostSave du statut d'abonnement de l'utilisateur (nouveau, existant ou désabonné). Pour ce faire, j'ai utilisé le magasin d'objets temporaire.

Le module de magasin d'objets temporaire est conçu pour transmettre de petites quantités de données entre des méthodes dans des scénarios comme celui-ci. Il est accessible via la valeur des modules passée dans chaque fonction:

 const tempObjectStore = modules.tempObjectStore; 

Puis une valeur peut être définie via la fonction set () . Par exemple, ici, je définis une valeur sous la clé de emailType égal à désinscrit :

 tempObjectStore.set ('emailType', 'unsubscribed'); 

Il est récupéré plus tard via la méthode get () :

 const emailType = tempObjectStore.get ('emailType'); 

Envoyer un e-mail

Pour envoyer l'e-mail à l'utilisateur, j'ai utilisé module de courrier électronique . Ce module est accessible via la valeur des modules passés dans chaque fonction:

 const email = modules.email; 

Pour envoyer un email, vous devez spécifier le from, to, subject et le corps du texte valeurs au minimum. Il existe des valeurs facultatives pour envoyer une version HTML du corps de l'e-mail ainsi que l'adresse de réponse et les destinataires cc et / ou bcc.

Pour envoyer l'e-mail, utilisez la méthode send () . C'est une méthode asynchrone qui renvoie une promesse .

 email.send (mailOptions.from, mailOptions.to, mailOptions.subject, mailOptions.text_body, mailOptions.reply_to, mailOptions.html_body, mailOptions.cc , mailOptions.bcc, (err) => {if (err) {return complete (). setBody (err);} complete () .setBody (contexte.body) .ok () .next ();}); [19659013] Il est à noter que le module de courrier électronique ne pourra pas envoyer d'e-mail lorsque vous testez en local (même en utilisant la méthode External Flex décrite  ici ). 

Shorten URL FlexService

Voir sur GitHub

Ce FlexService est conçu comme un exemple relativement simple de connexion à une API tierce au sein d'un FlexService. Dans ce cas, il utilise API de raccourcissement d'URL de Google pour lequel vous aurez besoin d'une clé API .

Demandes externes

Comme le FlexService Runtime s'exécute sur Node.js, il peut intégrer des paquets npm . Dans ce cas, j'ai utilisé Request pour la requête HTTP requise pour communiquer avec l'API Google.

Pour utiliser une requête de type bibliothèque dans votre FlexService, vous devez d'abord l'installer et l'ajouter à votre package.json :

 npm demande d'installation --save 

Pour le rendre disponible dans le fichier JavaScript, vous devez require it:

 const request = require ( 'request'); 

Ensuite, nous pouvons l'utiliser comme dans n'importe quelle autre application Node.js (Request renvoie également une promise ):

 request.post (requestOptions, (error, res , corps) => {if (erreur) {return complete (). setBody (erreur) .runtimeError (). done ();} complete () .setBody ({shortUrl: body.id}) .done ();} 

Obtention de données à partir de collections Kinvey

Accéder à des données dans une collection Kinvey à partir d'un FlexService n'est pas difficile, comme vous le pensez probablement. Dans le cas de FlexService, ainsi que du service d'analyse textuelle dont nous parlerons plus tard, plutôt que de coder en dur la clé API dans le service, j'ai décidé d'y accéder via une collection spécialement conçue pour stocker les valeurs de configuration. [19659003] Étant donné que FlexServices s'exécute dans le contexte de la clé principale, je peux rendre cette collection contenant des éléments tels que mes secrets d'API privés mais toujours accéder via FlexService. Seuls les utilisateurs disposant d'un accès par clé principale (via la console Web Kinvey, par exemple) auront accès à ces clés. Pour toutes fins utiles, j'utilise cette collection comme un type de magasin de valeur de clé privée .

Regardons comment cette collection (nommée "config") est interrogée. Tout d'abord, nous avons besoin d'une référence au module dataStore à partir duquel nous pouvons obtenir une référence à la collection (c'est-à-dire la configuration). Enfin, nous avons besoin d'une référence au module de requête que nous transmettrons lors de l'interrogation de cette collection.

 const store = modules.dataStore (options); const config = store.collection ('config'); const query = new modules.Query (); 

Ensuite, je définis l'objet de requête pour rechercher une colonne (ie configKey ) égale à une valeur, qui, dans ce cas, est la valeur de la variable configKey qui équivaut à "API API Google Shortener"

 query.equalTo ('configKey', configKey); 

Enfin, j'interroge la collection en utilisant le find ()

 config.find (query, (err, result) => {...}); 

Pour simplifier, j'ai laissé ici l'implémentation de la méthode, mais la chose clé à retenir est que la méthode find () renvoie une promesse . Vous pouvez voir le code complet ici .

Text Analytics FlexService

Voir sur GitHub

Ce FlexService est conçu comme un exemple d'intégration ] apprentissage automatique API dans un FlexService. Dans ce cas, il utilise l'API Microsoft Azure Text Analytics pour laquelle vous aurez besoin d'une clé API . L'API Text Analytics détermine la langue et / ou le sentiment du texte.

Les concepts au sein de FlexService lui-même tels que l'accès aux données de collection, l'utilisation d'une méthode comme point de terminaison personnalisé et les demandes d'API externes donc je ne vais pas les insinuer ici. Une note, cependant, est que le service utilise le paquet npm https pour sa demande externe. Cela fonctionne légèrement différemment de la demande . Si vous êtes curieux, vérifiez le code de l'exemple FlexService

FlexServices de test local pendant le développement

Lors de la création de FlexServices, il y a souvent une déconnexion entre le développement local et les services, qui existent dans le nuage. Cela peut engendrer une frustration particulière lorsque vous avez besoin d'interagir avec des services, tels que des données, qui existent uniquement dans l'environnement de l'application en nuage.

Heureusement, en utilisant la prise en charge de External Flex Services peut combiner des tests locaux avec des données et des services à distance dans la plupart des cas. J'ai déjà écrit un guide complet sur les tests locaux en utilisant External Flex Services si vous voulez en savoir plus sur la façon de l'utiliser lors de la construction de vos propres FlexServices.

Aller plus loin

Vous pouvez accéder à tous les exemples ainsi que la documentation sur la façon d'utiliser chacun d'entre eux via mon dépôt flex-service-samples sur GitHub .

FlexServices peut faire plus que les fonctions décrites dans cet article. Vous pouvez créer des gestionnaires d'authentification personnalisés à l'aide de FlexAuth . Cela vous permet de créer un flux d'authentification unique qui correspond aux besoins de votre entreprise, même s'il n'est pas pris en charge par notre service d'authentification Mobile Identity Connect . Enfin, il y a FlexData qui vous permet de construire des connexions de données personnalisées pour vos collections Kinvey, même si elles ne sont pas supportées par notre fonction RapidData .

Comme je le pense, FlexServices sont vraiment là où réside le vrai pouvoir de Kinvey. Une fois que vous devenez à l'aise de les utiliser, cela peut vous offrir toutes sortes d'opportunités pour améliorer l'architecture de votre application.




Source link