KOA, creado por el equipo expreso original, se compromete a convertirse en un marco web más pequeño, más fuerte y más expresivo. Utilizando KOA para escribir aplicaciones web, al combinar diferentes generadores, puede eliminar la función de la función de devolución de llamada duplicada y engorrosa y mejorar en gran medida la eficiencia del manejo de errores comunes. KOA no une ningún middleware en los métodos del núcleo, solo proporciona una biblioteca de funciones liviana y elegante, lo que hace que escribir aplicaciones web sea fácil de usar.
Instalar KOA
KOA depende de un entorno de nodo que admita el generador, es decir, la versión del nodo debe ser 0.11.9 o más, de lo contrario no se ejecutará.
Use NPM:
$ npm instalación koa
O, seleccione Instalar a nivel mundial:
$ npm instalación -g KOA
Ejemplo
Aquí hay un simple ejemplo de KOA:
var koa = request ('koa'); var app = koa (); // loggerapp.use (function *(next) {var inicio = nueva fecha; rendimiento Next; var ms = new Date - start; console.log (' %s %s - %s', this.method, this.url,});}); // respuestasepp.use (function *() {this.body » World ';}); App.Listen (3000);A diferencia de las funciones normales, las funciones del generador se declaran como función*. Funciones declaradas con este rendimiento de soporte de palabras clave. El uso y la importancia del rendimiento se discutirán más adelante.
Ejecutar koa
Al ejecutar KOA, debe ejecutar en modo de armonía. Por conveniencia, puede establecer el nodo como alias para comenzar el modo de armonía de forma predeterminada:
alias nodo = 'nodo --mony'
De esta manera, puede usarlo directamente al ejecutar JS relacionado.
En cascada
Este es un concepto relativamente abstracto. KOA Middleware está en cascada de una manera muy tradicional, que es lo que se llama en cascada aquí.
En el desarrollo anterior de nodos, el uso frecuente de devoluciones de llamada no era conveniente para mostrar la lógica de código complejo. En KOA, podemos escribir un middleware verdaderamente expresivo. En comparación con el método de Connect para implementar el middleware, el enfoque de KOA no es simplemente entregar el control al middleware después del middleware hasta que finalice el programa. KOA ejecuta código como un clip de papel. Cuando el usuario solicite pasar el middleware, se pasará a la siguiente ruta que cumpla con la solicitud (aguas abajo). Cuando el rendimiento siguiente no puede capturar el siguiente middleware, devuelve en orden inverso para continuar ejecutando el código (aguas arriba).
El siguiente ejemplo muestra el ejemplo de Hello World escrito usando este método especial: al principio, la solicitud del usuario pasa a través del middleware de tiempo X-Response y el middleware de registro. Estos dos MiddleWares registran algunos detalles de solicitud, y luego "pasa" el middleware de respuesta una vez, finalmente terminan la solicitud y regrese a "Hello World".
Cuando el programa se ejecuta a continuación, el flujo de código detendrá la ejecución del código restante del middleware y cambiará al siguiente middleware definido para ejecutar el código. Esta forma de cambiar el control se llama aguas abajo. Cuando no hay el próximo middleware para ejecutar aguas abajo, el código se ejecutará en orden inverso.
var koa = require ('koa'); var app = koa (); // x-resesponse-timeApp.use (function *(next) {// (1) Ingrese la ruta var inicial = nueva fecha; el rendimiento next; // (5) Ingrese el middleware de tiempo X-Response nuevamente y registre el tiempo "recorrido" a través de esta mshidSware var ms = nueva fecha-star (6) devuelve esto.body}); // loggerapp.use (function *(next) {// (2) Ingrese logger middleware var start = New Date; rendimiento Next; // (4) Ingrese el Middleware de Logger nuevamente y registre la hora en que "viaja" a través de este middleware Var MS = New Date - start; Console.log (' %s %s - %s', this.method, this.url; ResponseApp.use (function *() {// (3) Ingrese el middleware de respuesta, y el siguiente middleware que cumple con las condiciones no se captura, y se pasa hacia arriba this.body = 'Hello World';}); App.listen (3000);En el código de ejemplo anterior, el middleware se ha marcado en los comentarios en el orden en que se ejecuta. También puede intentar ejecutar este ejemplo usted mismo e imprimir e grabar la salida y el tiempo que lleva el tiempo de cada enlace.
.middleware1 {// (1) Haz algunas cosas .Middleware2 {// (2) Haz otras cosas .Middleware3 {// (3) ¡No hay siguiente rendimiento! // this.body = 'Hello World'} // (4) Haz algunas otras cosas más tarde} // (5) Haz algunas cosas más finales y regresa}La orden de ejecución del middleware está marcada en el código de pseudo anterior. ¿Se parece un poco al rendimiento cuando Ruby ejecuta un bloque? Tal vez esto te ayude a comprender mejor cómo funciona KOA.
KOA Acceso a la operación de la base de datos MySQL
Método de implementación uno (co-mysql)
La biblioteca MySQL se implementa en forma de devoluciones de llamada, mientras que el middleware KOA requiere la forma de promesa. Después de buscar, encontramos que Co-Mysql y MySQL-Co. Las dos bibliotecas tienen ideas similares. MySQL-Co tiene un grado de encapsulación más alto y utiliza el MySQL2 más rápido, mientras que el Co-Mysql es más simple, solo encapsulando mysql.Query en la forma de promesa. El siguiente es el método de escritura basado en co-mysql
var wrapper = require('co-mysql'), mysql = require('mysql');var options = { host : 'localhost', port : 3306, database : 'test', user: 'root', password : 'rootroot'};var pool = mysql.createPool(options), p = wrapper(pool);... var rows = yield p.query('SELECT 1'); rendimiento this.render ('índice', {título: filas [0] .FieldName}); ...}) ();Implementar el método dos (Nodo Promisify)
Encuentre la biblioteca de nodos Promisify y puede convertir la biblioteca en un formulario de promesa en su conjunto. El código de muestra es el siguiente:
var promisify = request ("promisify-nodo"); var db = promisify ("mydbhelper"); ... var filas = rendimiento db.getByid ('tableName', {id: 1}); rendimiento este.render ('índice', {título: filas [0] .FieldName}); ...Método de implementación tres (Thunkify, Thunkify-Wrap)
La encapsulación también se puede completar usando Thunkify. Thunkify-Wrap es una versión mejorada de Thunkify. Sin embargo, según la explicación, este método puede eliminarse en el desarrollo futuro. El uso aproximado es el siguiente:
var genify = request ('thunkify-wrap'). genify; var db = genify ("mydbhelper"); ... var filas = rendimiento db.getByid ('tableName', {id: 1}); rendimiento este.render ('índice', {título: filas [0] .FieldName}); ...Método de implementación cuatro (método directo)
Transforme directamente el código original en Express en un formulario de promesa, consulte CO-MYSQL y aprenda cuidadosamente el conocimiento relevante de la promesa y complete la transformación del código existente. El código y la descripción son los siguientes:
dbhelper.js
var config = request ('./ dbconfig'); var options = {'host': config.db_host, 'puerto': config.db_port, 'base de datos': config.db_name, 'user': config.db_user, 'contraseña': config.db_passwd} var mysql = requirir ('mysql'); var piscol = mysql.createPool (opciones); // Encapsulación interna de MySQL, Execute SQL Declary Función ExecQuery (SQL, Valores, devolución de llamada) {var errinfo; Pool.getConnection (function (err, conexión) {if (err) {errinfo = 'db-get excepción de la base de datos de la base de datos!'; tirar errinfo;} else {var Querys = Connection.Query (sql, valores, function (err, ROWS) {Release (Connection); if (err) {Errinfo = 'DB-SQL Ejecution Error:' + Err; err; err; devolución de llamada (nulo, filas); /Nota: el primer parámetro debe ser nulo}}); } catch (err) {}} // Devuelve el formulario de función de promesa a la interfaz externa exports.getById = function (tableName, id) {return new promise (function (resolve, rechazar) {var valores = {id: id}; var sql = 'select * de?'; ExecQuery (sql, [Tablename, valores], function (err, rows) {if (if (if (select * de? '; } else {resolve (filas);}})});} rutas/index.jsvar db = requisito ("../ dbhelper"); ... var filas = rendimiento db.getByid ('tableName', {id: 1}); rendimiento este.render ('índice', {título: filas [0] .FieldName}); ...Código
Consulte la sección Operación de la base de datos en este proyecto. El proyecto está en desarrollo continuo y la sección de ejemplo de la base de datos se toma de este proyecto.
https://github.com/zhoutk/koadmin.git