KOA, créé par l'équipe Express originale, s'est engagée à devenir un cadre Web plus petit, plus fort et plus expressif. En utilisant KOA pour écrire des applications Web, en combinant différents générateurs, vous pouvez éliminer la fonction de fonction de rappel en double et encombrante et améliorer considérablement l'efficacité de la gestion des erreurs communes. KOA ne lie aucun middleware dans les méthodes du noyau, il ne fournit qu'une bibliothèque de fonctions légère et élégante, ce qui rend les applications Web d'écriture faciles à utiliser.
Installer KOA
KOA dépend d'un environnement de nœud qui prend en charge le générateur, c'est-à-dire que la version du nœud doit être de 0,11,9 ou plus, sinon elle ne sera pas exécutée.
Utiliser NPM:
$ npm install koa
Ou, sélectionnez Installer à l'échelle mondiale:
$ npm install -g koa
Exemple
Voici un exemple simple de KOA:
var koa = require ('koa'); var app = koa (); // loggerApp.use (function * (next) {var start = new Date; ne dawe World ';}); app.Listen (3000);Contrairement aux fonctions normales, les fonctions du générateur sont déclarées comme fonction *. Fonctions déclarées avec ce rendement de support de mot-clé. L'utilisation et la signification du rendement seront discutées plus tard.
Exécuter KOA
Lors de l'exécution de KOA, vous devez exécuter en mode d'harmonie. Pour plus de commodité, vous pouvez définir le nœud comme alias pour démarrer le mode harmonie par défaut:
alias node = 'node --harmony'
De cette façon, vous pouvez l'utiliser directement lors de l'exécution de JS connexes.
En cascade
Il s'agit d'un concept relativement abstrait. KOA Middleware est en cascade d'une manière très traditionnelle, ce qu'on appelle la cascade ici.
Dans le développement précédent des nœuds, l'utilisation fréquente des rappels n'était pas pratique pour afficher la logique de code complexe. Dans KOA, nous pouvons écrire des middleware vraiment expressifs. Par rapport à la méthode de Connect pour implémenter le middleware, l'approche de KOA n'est pas simplement pour remettre le contrôle au middleware après middleware jusqu'à la fin du programme. KOA exécute du code comme un trombone. Lorsque l'utilisateur demande de passer le middleware, il sera transmis à l'itinéraire suivant qui répond à la demande (en aval). Lorsque le rendement suivant ne peut pas capturer le middleware suivant, il revient dans l'ordre inverse de continuer à exécuter le code (en amont).
L'exemple suivant montre l'exemple Hello World écrit à l'aide de cette méthode spéciale: Au début, la demande de l'utilisateur passe par le middleware X-Response-Time et le middleware de journalisation. Ces deux middlewares enregistrent certains détails de la demande, puis "passe par" le middleware de réponse une fois, terminez enfin la demande et retournez à "Hello World".
Lorsque le programme s'exécute pour céder ensuite, le flux de code suscitera l'exécution du code restant du middleware et passera au middleware défini suivant pour exécuter le code. Cette façon de changer de contrôle est appelée en aval. Lorsqu'il n'y a pas de middleware prochain à exécuter en aval, le code sera exécuté dans l'ordre inverse.
var koa = require ('koa'); var app = koa (); // x-response-timeApp.use (function * (suivant) {// (1) entrez la route var start = new Date; rendement suivant; // (5) entrez à nouveau le middleware de la réponse x. // (6) renvoie this.body}); // loggerApp.use (fonction * (next) {// (2) Entrez le logger middleware var start = new Date; rendement suivant; // (4) Entrez à nouveau le journal de journalisation et enregistrez à nouveau l'heure à laquelle il "Travels" via ce middleware twice var ms = new Date - start; Console.log ('% s -% s', this.method, this.url, gard MS);}); // ResponseApp.Use (Function * () {// (3) Entrez le middleware de réponse, et le middleware suivant qui remplit les conditions n'est pas capturé et transmis en amontDans l'exemple de code ci-dessus, le middleware a été marqué dans les commentaires dans l'ordre dans lequel il est exécuté. Vous pouvez également essayer d'exécuter cet exemple vous-même et d'imprimer et d'enregistrer la sortie et le temps de chaque lien.
.middleware1 {// (1) faire des trucs .middleware2 {// (2) faire d'autres trucs .middleware3 {// (3) pas de rendement suivant! // this.body = 'hello world'} // (4) faire d'autres trucs plus tard} // (5) faire des trucs dure et retourner}L'ordre d'exécution du middleware est marqué dans le pseudo-code ci-dessus. Cela ressemble un peu au rendement lorsque Ruby exécute un bloc? Peut-être que cela vous aidera à mieux comprendre le fonctionnement de KOA.
Opération de base de données MySQL Access
Méthode d'implémentation ONE (Co-Mysql)
La bibliothèque MySQL est implémentée sous forme de rappels, tandis que le middleware KOA nécessite la forme de promesse. Après la recherche, nous avons trouvé que Co-Mysql et MySQL-Co. Les deux bibliothèques ont des idées similaires. MySQL-CO a un degré d'encapsulation plus élevé et utilise le MySQL2 plus rapide, tandis que Co-Mysql est plus simple, encapsulant simplement MySQL.Query sous forme de promesse. Ce qui suit est la méthode d'écriture basée sur Co-Mysql
var wrapper = require ('co-mysql'), mysql = require ('mysql'); var options = {host: 'localhost', port: 3306, base de données: 'test', utilisateur: 'root', mot de passe: 'rootroot'}; var pool = mysql.createpool (options), p = wrapper (pool); ... var rows = rendu. rende this.render ('index', {title: lignes [0] .FieldName}); ...}) ();Implémenter la méthode deux (promisify-node)
Trouvez la bibliothèque Promisify-Node et vous pouvez convertir la bibliothèque en une forme de promesse dans son ensemble. L'exemple de code est le suivant:
var promisify = require ("promisify-node"); var db = promisify ("mydbhelper"); ... var lignes = rendre db.getbyid ('tableName', {id: 1}); rende this.render ('index', {title: lignes [0] .FieldName}); ...Méthode d'implémentation trois (Thunkify, Thunkify-wap)
L'encapsulation peut également être terminée à l'aide de Thunkify. Thunkify-wap est une version améliorée de Thunkify. Cependant, selon l'explication, cette méthode peut être éliminée dans le développement futur. L'utilisation approximative est la suivante:
var genify = require ('thunkify-wrap'). Genify; var db = génify ("mydbhelper"); ... var lignes = rendre db.getbyid ('tableName', {id: 1}); rende this.render ('index', {title: lignes [0] .FieldName}); ...Méthode d'implémentation quatre (méthode directe)
Transformez directement le code d'origine sous Express en un formulaire de promesse, reportez-vous à Co-Mysql et apprenez soigneusement la connaissance pertinente de la promesse et complétez la transformation du code existant. Le code et la description sont les suivants:
dbhelper.js
var config = require ('./ dbconfig'); var options = {'host': config.db_host, 'port': config.db_port, 'database': config.db_name, 'user': config.db_user, 'password': config.db_passwd} var mysql = require ('mysql'); var pool = MySQL.CreatePool (Options); // Encapsulation interne de MySQL, EXECUTE SQL Instruction Function ExecQuey (SQL, VALEUR, CALLBACK) {var errinfo; Pool.getConnection (fonction (err, connexion) {if (err) {errinfo = 'db-get-get-base de connexion Exception! Callback (null, lignes); } catch (err) {}} // renvoie le formulaire de fonction Promise à l'interface externe exports.getById = function (tableName, id) {return new promest (function (résoudre, rejeter) {var valeurs = {id: id}; var sql = ' rejeter (err);} else {Resolve (lignes);}})});} routes / index.jsvar db = require (../ dbHelper "); ... var ligne rende this.render ('index', {title: lignes [0] .FieldName}); ...Code
Veuillez vous référer à la section Fonctionnement de la base de données dans ce projet. Le projet est en développement continu et la section Exemple de la base de données est tirée de ce projet.
https://github.com/zhoutk/koadmin.git