元のエクスプレスチームによって作成されたKOAは、より小さく、より強力で、より表現力のあるWebフレームワークになることに取り組んでいます。 KOAを使用して、さまざまなジェネレーターを組み合わせてWebアプリケーションを作成すると、重複した面倒なコールバック関数のネストを排除し、一般的なエラー処理の効率を大幅に向上させることができます。 KOAは、カーネルメソッドのミドルウェアをバインドせず、機能の軽量でエレガントなライブラリを提供するだけで、Webアプリケーションの作成を使いやすくします。
KOAをインストールします
KOAは、ジェネレーターをサポートするノード環境に依存します。つまり、ノードのバージョンは0.11.9以下である必要があります。そうしないと、実行されません。
NPMを使用してください:
$ npmインストールkoa
または、グローバルにインストールを選択します。
$ npmインストール-G KOA
例
これがKOAの簡単な例です:
var koa = require( 'koa'); var app = koa(); // loggerapp.use(function *(next){var start = new date; new next; var ms = new date -start; console.log( '%s -%s'、this.method、this.url、ms);}); world ';}); app.listen(3000);通常の関数とは異なり、ジェネレーター関数は関数*として宣言されます。関数は、このキーワードサポートの利回りで宣言されました。利回りの使用と重要性については後で説明します。
KOAを実行します
KOAを実行するときは、調和モードで実行する必要があります。便宜上、デフォルトでハーモニーモードを開始するためのエイリアスとしてノードを設定できます。
エイリアスnode = 'node-ヘルモニー'
これにより、関連するJSを実行するときに直接使用できます。
カスケード
これは比較的抽象的な概念です。 KOAミドルウェアは非常に伝統的な方法でカスケードをしています。これは、ここでカスケードと呼ばれるものです。
以前のノード開発では、複雑なコードロジックを表示するのに便利ではありませんでした。 KOAでは、本当に表現力豊かなミドルウェアを書くことができます。ミドルウェアを実装するConnectの方法と比較して、KOAのアプローチは、プログラムが終了するまでミドルウェアの後にミドルウェアにコントロールを引き渡すだけではありません。 KOAはペーパークリップのようにコードを実行します。ユーザーがミドルウェアを渡すように要求すると、リクエストを満たす次のルート(下流)に渡されます。次に次のミドルウェアをキャプチャできない場合、コード(上流)の実行を継続するために逆順に戻ります。
次の例は、この特別な方法を使用して書かれたHello Worldの例を示しています。最初は、ユーザーの要求がX-Response-Timeミドルウェアとロギングミドルウェアを通過します。これらの2つのMiddlewaresはいくつかのリクエストの詳細を記録し、その後、応答ミドルウェアを1回「通過」し、最終的にリクエストを終了し、「Hello World」に戻ります。
プログラムが次に生じるように実行されると、コードフローはミドルウェアの残りのコードの実行を一時停止し、次の定義されたミドルウェアに切り替えてコードを実行します。制御を切り替えるこの方法は、下流と呼ばれます。ダウンストリームを実行する次のミドルウェアがない場合、コードは逆順序で実行されます。
var koa = require( 'koa'); var app = koa(); // x-response-timeapp.use(function *(next){//(1)ルートvar start = new Date; next next; //(5)x-response-time middlewareに再び入力し、「旅行した時間」を記録し、MS = 'sets(') //(6)return this.body}); // loggerapp.use(function *(next){//(2)Enter entle entle entle enter enter entle entle ently logger middleware var start = new date; next; //(4)再びロガーミドルウェアを入力し、このミドルウェアを介して2回var ms = new Date -start.log( '%s -s% ms);}); // responseapp.use(function *(){//(3)応答ミドルウェアを入力し、条件を満たす次のミドルウェアはキャプチャされず、上流に渡されます。上記のコードの例では、ミドルウェアが実行される順序でコメントにマークされています。また、この例を自分で実行してみて、各リンクの出力と時間をかけて印刷して記録することもできます。
.middleware1 {//(1)いくつかのことを行う.middleware2 {//(2)他のものを行う.middleware3 {//(3)次の収量なし! // this.body = 'hello world'} //(4)後で他のことをする} //ミドルウェアの実行順序は、上記の擬似コードでマークされています。 Rubyがブロックを実行すると、収量のように見えますか?たぶん、これはあなたがKOAの仕組みをよりよく理解するのに役立つでしょう。
KOAアクセスMySQLデータベース操作
実装方法1(co-mysql)
MySQLライブラリはコールバックの形で実装されていますが、KOAミドルウェアには約束の形が必要です。検索後、Co-MySQLとMySQL-Coが発見されました。 2つのライブラリには同様のアイデアがあります。 MySQL-Coはカプセル化の学位が高く、より高速なMySQL2を使用しますが、Co-MySQLはよりシンプルで、MySQL.Queryを約束の形にカプセル化します。以下は、co-mysqlに基づく執筆方法です
var wrapper = require( 'co-mysql')、mysql = require( 'mysql'); var options = {hosthost '、port:3306、database:' test '、user:' root '、' rootroot '}; var pool = mysql.createpool(options)、p = lapper(' fool( 'fool); ... fool); this.render( 'index'、{title:rows [0] .fieldname}); ...})()();メソッド2(promisify-node)を実装する
Promisify-nodeライブラリを見つけて、ライブラリを全体として約束のフォームに変換できます。サンプルコードは次のとおりです。
var promisify = require( "promisify-node"); var db = promisify( "mydbhelper"); ried this.render( 'index'、{title:rows [0] .fieldname}); ...実装方法3(thunkify、thunkify-wrap)
カプセル化は、Thunkifyを使用して完了することもできます。 Thunkify-Wrapは、Thunkifyの拡張バージョンです。ただし、説明によれば、この方法は将来の開発で排除される可能性があります。おおよその使用は次のとおりです。
var genify = require( 'thunkify-rap')。genify; var db = genify( "mydbhelper"); ried this.render( 'index'、{title:rows [0] .fieldname}); ...実装方法4(直接的な方法)
Expressの下の元のコードをPromiseフォームに直接変換し、Co-MysQLを参照し、約束の関連する知識を慎重に学び、既存のコードの変換を完了します。コードと説明は次のとおりです。
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 = reques mysql.createpool(options); // mysqlの内部カプセル化、sqlステートメント関数execquery(sql、values、callback){var errinfo; pool.getConnection(function(err, connection) { if (err) { errinfo = 'DB-get database connection exception!'; throw errinfo; } else { var querys = connection.query(sql, values, function(err, rows) { release(connection); if (err) { errinfo = 'DB-SQL statement execution error:' + err; callback(err); } else { callback(null、rows); } catch(err){}} // Promise関数フォームを外部インターフェイスエクスポートに戻す。getByid= function(tablename、id){return new promise(resolve、requed){var values = {id:id}; var sql = 'select * from ??'; execquery(sql、values、err(err、err); } else {Resolve(rows);});} routes/index.jsvar db = require( "../ dbhelper"); ried this.render( 'index'、{title:rows [0] .fieldname}); ...コード
このプロジェクトのデータベース操作セクションを参照してください。プロジェクトは継続的な開発中であり、データベースの例のセクションはこのプロジェクトから取得されます。
https://github.com/zhoutk/koadmin.git