Dans mon projet, j'avais besoin d'une fonctionnalitĂ© qui me permettrait de ne pas perdre les donnĂ©es saisies en cas de panne de connexion Internet et je suis arrivĂ© avec un "Broker" trĂšs simple qui me permettrait de ne pas perdre de donnĂ©es lorsque la connexion Ă©tait perdue, mais de les envoyer lorsque la connexion est rĂ©tablie. «Courtier» n'est peut-ĂȘtre pas un bon nom pour lui, mais ne jugez pas strictement. Je veux partager, peut-ĂȘtre que quelqu'un sera utile.
Ă propos du projet
Mon projet est conçu pour rendre compte des dĂ©penses et des revenus ou comme une simple version de comptabilitĂ© Ă domicile. Il a Ă©tĂ© créé en tant qu'application Web progressive, de sorte qu'il est pratique de l'utiliser sur des appareils mobiles, ainsi que pour ouvrir les capacitĂ©s des notifications Push, accĂ©der Ă la camĂ©ra pour lire les codes-barres, etc. Il existe une application mobile similaire appelĂ©e ZenMoney, mais je voulais quelque chose de moi-mĂȘme et Ă ma maniĂšre.
L'émergence des idées
J'essaie de garder une trace claire des dĂ©penses et des revenus, mais comme on oublie souvent d'ajouter les postes nĂ©cessaires, en particulier ceux liĂ©s Ă la trĂ©sorerie, je dois le faire presque immĂ©diatement lorsque la "transaction" s'est produite. Parfois, je saisissais des donnĂ©es dans les transports publics, comme le mĂ©tro, oĂč les pertes de connexion se produisent souvent, malgrĂ© le rĂ©seau Wi-Fi trĂšs rĂ©pandu. C'Ă©tait dommage que tout se fige et que rien ne se passe, puis les donnĂ©es ont simplement Ă©tĂ© perdues.
L'idĂ©e est venue de l'utilisation d'un courtier de file d'attente tel que RabbitMQ. Bien sĂ»r, j'ai une solution plus simple et moins fonctionnelle, mais il y a quelque chose de similaire Ă ses principes. Je pensais que vous pouvez tout enregistrer, par exemple, dans Cache ou LocalStorage en tant qu'objet avec une file d'attente de demandes «non satisfaites», et lorsqu'une connexion apparaĂźt, vous pouvez les exĂ©cuter en toute sĂ©curitĂ©. Bien entendu, elles ne sont pas exĂ©cutĂ©es par ordre de prioritĂ©, ce qui, grĂące au traitement asynchrone des requĂȘtes en langage JS, est encore meilleur, Ă©tant donnĂ© que vous n'avez qu'un seul «abonné». J'ai rencontrĂ© quelques difficultĂ©s, peut-ĂȘtre mĂȘme la mise en Ćuvre de tout cela semblera un peu tordue, mais c'est une solution qui fonctionne. Bien sĂ»r, il peut ĂȘtre amĂ©liorĂ©, mais pour l'instant je vais dĂ©crire l'option existante "brute" mais fonctionnelle.
Pour commencer
La premiĂšre chose Ă laquelle j'ai pensĂ© Ă©tait de savoir oĂč stocker les donnĂ©es en l'absence de connexion?! Le service woker imposĂ© par PWA fonctionne bien avec le cache, mais est-il judicieux d'utiliser le cache?! Une question difficile, je ne vais pas y entrer. En gĂ©nĂ©ral, j'ai dĂ©cidĂ© que LocalStorage est mieux pour moi. Ătant donnĂ© que LocalStorage stocke des valeurs de type clĂ©: valeur, l'objet a dĂ» ĂȘtre ajoutĂ© en tant que chaĂźne Json. Dans mon projet de dĂ©veloppement externe, j'ai ajoutĂ© un rĂ©pertoire appelĂ© QueueBroker au dossier de classe
Structure des fichiers/**----**/
âââ app.js
âââ bootstrap.js
âââ classes
â âââ QueueBroker
â âââ index.js
â âââ Library
â âââ Broker.js
â âââ Storage.js
âââ components
/**----**/
Mon projet est réalisé dans la pile Laravel + VueJs, donc une certaine dépendance de la structure du fichier est requise. Je ne sais pas comment dans de tels cas il est correct d'appeler vos propres répertoires pour les classes, donc je l'ai fait.
Le fichier d'index a Ă©tĂ© créé pour simplement connecter des modules Ă partir de la bibliothĂšque imbriquĂ©e. Ce n'est peut-ĂȘtre pas une solution trĂšs Ă©lĂ©gante, mais je voulais faire en sorte que si je change soudainement d'avis d'utiliser LocalStorage, j'Ă©crirai une autre classe pour Storage avec les mĂȘmes mĂ©thodes, la passerai au constructeur du courtier et utiliserai l'autre stockage sans rien changer.
index.js const Broker = require('./Library/Broker'); const Storage = require('./Library/Storage'); module.exports.Broker = Broker; module.exports.Storage = Storage;
Cette méthode vous permet de connecter uniquement les bibliothÚques dont j'ai besoin dans mes scripts, par exemple, si j'ai besoin des deux:
import {Storage, Broker} from '../../classes/QueueBroker/index';
Pour faciliter la modification de la classe de stockage, j'ai créé une sorte de constructeur pour la classe Broker, dans lequel l'objet Storage pourrait ĂȘtre passĂ© en argument, l'essentiel est qu'il possĂšde les fonctions nĂ©cessaires. Je sais que sur ES6 je pouvais Ă©crire classe et constructeur, mais j'ai dĂ©cidĂ© de le faire Ă l'ancienne - prototype. Je vais Ă©crire des commentaires directement par code:
Broker.js const axios = require('axios');
Ensuite, vous avez besoin de l'objet de stockage lui-mĂȘme, qui enregistrera et rĂ©cupĂ©rera tout avec succĂšs du stockage
Lorsque tout ce qui prĂ©cĂšde sera prĂȘt, cela peut ĂȘtre utilisĂ© Ă votre discrĂ©tion, je l'utilise comme ceci:
Utiliser lors de l'enregistrement Utiliser lors de la reconnexion PS
C'est difficile pour moi de parler du code, j'ai donc essayé de fournir le code dans les exemples aussi détaillé que possible avec des commentaires détaillés. Si vous avez des idées pour améliorer cette solution ou améliorer cet article, je serai heureux de les voir dans les commentaires. J'ai pris des exemples de mon propre projet sur Vue, je l'explique afin de bien comprendre pourquoi mes méthodes sont ainsi appelées et pourquoi j'y accÚde par
ce biais. Je ne le fais pas dans cet article spécifiquement sur Vue, donc je ne fournis pas d'autre code de composant, je le laisse pour la compréhension.