Kooa 2

11342 ワード

Kooaは7.6以上のバージョンを使用しなければなりません.もしあなたのバージョンがこの要求を下回るなら、まずNodeをアップグレードします.
基本的な使い方
Kooaは、一回の会話の文脈(HTTP要求とHTTP応答を含む)を示すContectオブジェクトを提供する.このオブジェクトを加工することで、ユーザーに戻る内容を制御することができます.Contect.reponse.body属性はユーザーに送る内容です.以下のとおりです
const Koa = require('koa');
const app = new Koa();
const main = ctx => {
  ctx.response.body = 'Hello World';
};
app.use(main);
app.listen(3000);    //  http   
app.listenとはhttp.c.reate Server.listenの略です.
main関数は、ctx.reponse.bodyを設定するために使用されます.その後、app.use方法を使ってmain関数をロードします.ctx.reponseはHTTP Resonseを表します.同様に、ctx.requestはHTTP Requestを表している.
Koraのデフォルトの戻りタイプはtext/planeで、他の種類の内容に戻りたいなら、ctx.request.acceptsで判断して、クライアントがどのようなデータを受け取りたいか(HTTP RequestのAcceptフィールドによる)を使用して、ctx.request.typeで戻りタイプを指定します.
const main = ctx => {
  if (ctx.request.accepts('xml')) {
    ctx.response.type = 'xml';
    ctx.response.body = 'Hello World';
  } else if (ctx.request.accepts('json')) {
    ctx.response.type = 'json';
    ctx.response.body = { data: 'Hello World' };
  } else if (ctx.request.accepts('html')) {
    ctx.response.type = 'html';
    ctx.response.body = '

Hello World

'; } else { ctx.response.type = 'text'; ctx.response.body = 'Hello World'; } };
ルート
原生ルート
ユーザ要求の経路は、ctx.request.pathによって取得され、簡単なルーティングが可能となる.
const main = ctx => {
  if (ctx.request.path !== '/') {
    ctx.response.type = 'html';
    ctx.response.body = 'Index Page';
  } else {
    ctx.response.body = 'Hello World';
  }
};
koa-routeモジュール
オリジナルのルートは使いにくいです.パッケージされた「koa-route」モジュールを使ってもいいです.
const route = require('koa-route');
const about = ctx => {
  ctx.response.type = 'html';
  ctx.response.body = 'Index Page';
};
const main = ctx => {
  ctx.response.body = 'Hello World';
};
app.use(route.get('/', main));
app.use(route.get('/about', about));
上のコードのうち、ルートパス/の処理関数はmainであり、/aboutパスの処理関数はaboutである.
静的リソース
静的資源は一つ一つルートを書くのが面倒くさいし、必要もないです.この部分の要求は、モジュールによってカプセル化される.
const path = require('path');
const serve = require('koa-static');
const main = serve(path.join(__dirname));
app.use(main);
リダイレクト
サーバはリダイレクト(redirect)アクセス要求を必要とし、ctx.reponse.redirerect()方法は、ユーザを別のルートに導くために、302ジャンプを発行することができる.
const redirect = ctx => {
  ctx.response.redirect('/');
  ctx.response.body = 'Index Page';
};
app.use(route.get('/redirect', redirect));
中間部品
const logger = (ctx, next) => {
  console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`);
  next();
}
app.use(logger);
上のコードの中のlogger関数は「中間件」と呼ばれています.HTTP RequestとHTTP Reponseの間にあるので、ある中間機能を実現します.app.use()は中間部品をロードするのに使います.
KKAのすべての機能は中間部品によって実現され、デフォルトでは二つのパラメータを受け付けます.最初のパラメータはContectオブジェクトで、二つ目のパラメータはnext関数です.next関数を呼び出しさえすれば、実行権を次の中間部品に渡すことができます.複数のミドルウェアは、「先進後出」(first-in-last-out)の順序でスタック構造を形成して実行される.中間部品の内部にnext関数が呼び出されていないと、実行権は渡されません.
  • の最外層の中間部品は、まず実行される.
  • next関数を呼び出して、実行権を次の中間部品に渡す.
  • 最内部層のミドルウェアは最後に実行されます.
  • 実行が終了したら、実行権を上の階の中間件に戻します.
  • 最外層の中間部品が実行権を回収した後、next関数の後のコードを実行します.
  • もし非同期の操作があるなら、中間部品は必ず「async関数」と書かなければなりません.
    const fs = require('fs.promised');
    const Koa = require('koa');
    const app = new Koa();
    const main = async function (ctx, next) {
      ctx.response.type = 'html';
      ctx.response.body = await fs.readFile('./demos/template.html', 'utf8');
    };
    app.use(main);
    app.listen(3000);
    
    中間部品の合成[koa-static]モジュールは、複数の中間部品を一つに合成することができる.
    const middlewares = compose([logger, main]);
    app.use(middlewares);
    
    Kooaは、エラーを出すためのctx.throw()方法を提供します.ctx.throw(500)は500のエラーを出すことです.
    const main = ctx => {
      ctx.throw(500);
    };
    
    ctx.reponse.statusを404に設定すると、ctx.throwに相当し、404エラーを返します.
    const main = ctx => {
      ctx.response.status = 404;
      ctx.response.body = 'Page Not Found';
    };
    
    エラーを処理しやすいように、try...catchを使って捕獲したほうがいいです.しかし、中間部品ごとにtry…catchを書くのは面倒くさいです.最外階の中間部品を全部担当して、中間部品のエラー処理を担当します.
    const handler = async (ctx, next) => {
      try {
        await next();  //               
      } catch (err) {
        ctx.response.status = err.statusCode || err.status || 500;
        ctx.response.body = {
          message: err.message
        };
      }
    };
    const main = ctx => {
      ctx.throw(500);
    };
    app.use(handler);
    app.use(main);
    
    Webアプリの機能
    Cookies
    ctx.co okieはCookieを読み、書きます.
    const main = function(ctx) {
      const n = Number(ctx.cookies.get('view') || 0) + 1;
      ctx.cookies.set('view', n);
      ctx.response.body = n + ' views';
    }
    //    http://127.0.0.1:3000 ,    1 views。      ,    2 views。
    
    フォームとは、POSTメソッドがサーバに送るキーのペアです.[koa-compose]モジュールは、POSTから要求されたデータ体からキーの値ペアを抽出するために使用されてもよい.
    const koaBody = require('koa-body');
    const main = async function(ctx) {
      const body = ctx.request.body;
      if (!body.name) ctx.throw(400, '.name required');
      ctx.body = { name: body.name };
    };
    app.use(koaBody());
    
    koa-body]モジュールはまた、ファイルのアップロードを処理するために使用されてもよい.見てください:https://github.com/ruanyf/jstutorial/blob/gh-pages/nodejs/koa.md 阮一峰教程
    カスケード式(Cascading)の構造は、つまり、階層的な呼び出しに属し、第一中間部品は第二中間部品を呼び出し、第二呼び出しは第三個であり、これに類推する.上流の中間部品は下流の中間部品が結果に戻るまで待たなければなりません.これは再帰的に似ています.
    Kooa 2とKooa 1の違い
    簡単に言うと、asyncが星号*awaitに取って代わりました.async/awaitの特徴:非同期ロジックを同期表記で最下層のawaitに戻すことができるのはPromiseの対象です.多層asynctionの同期書き方で伝統的なcalbackの入れ子に代わることができます.
    Kooa 2特性:
  • はhttpコンテキスト、要求、応答だけでなく、async/awaitベースの中間のコンテナを提供します.
  • ES 7のasync/awaitを利用して伝統的なエコーネスト問題と代替を処理します.koa@1のgeneratorですが、node.js 7.xのhanomonyモードでasync/await
  • をサポートすることができます.
  • 中間部品はasync/awaitパッケージだけに対応しています.koa@1generator中間部品に基づいて、中間部品のkoa-convertでカプセル化してから使用できます.
  • generatorミドルウェアは、koa v 1とv 2で
  • を使用して開発されました.
  • async awaitミドルウェア開発とCoa v 2でしか使用できない
  • const Koa = require('koa')
    const app = new Koa()
    //     :
    app.use( async ( ctx ) => {
      let url = ctx.request.url
      ctx.body = url
    })
    app.listen(3000)
    
    koa-routerミドルウェア
    npm/cnpm install--save koa-router
    const Koa = require('koa')
    const fs = require('fs')
    const app = new Koa()
    const Router = require('koa-router')
    let home = new Router()
    //    1
    home.get('/', async ( ctx )=>{
      let html = `
        
      ctx.body = html
    })
    //    2
    let page = new Router()
    page.get('/404', async ( ctx )=>{
      ctx.body = '404 page!'
    }).get('/helloworld', async ( ctx )=>{
      ctx.body = 'helloworld page!'
    })
    //        
    let router = new Router()
    router.use('/', home.routes(), home.allowedMethods())
    router.use('/page', page.routes(), page.allowedMethods())
    //        
    app.use(router.routes()).use(router.allowedMethods())
    
    app.listen(3000, () => {
      console.log('[demo] route-use-middleware is starting at port 3000')
    })
    
    公式サイトの技術説明
    Kooaはnode v 7.6.0またはES 2015およびより高いバージョンとasync方法によってサポートされています.必修のハローワールド応用:
    const Koa = require('koa');
    const app = new Koa();
    app.use(async ctx => {
      ctx.body = 'Hello World';
    });
    app.listen(3000);
    
    カスケードは一連の機能によって直接に制御を伝達し、戻るまでKooaは「下流」を呼び出し、その後「上流」に流れることを制御する.中間部品がnext()を呼び出すと、関数は一時停止し、定義された次の中間部品に制御を伝達します.下流でより多くの中間部品が実行されない場合、スタックは展開され、各中間体回復はその上流挙動を実行する.
    app.use(function)は、与えられた中間手段をこのアプリケーションに追加します.app.keys=署名のCookie鍵を設定します.
    コンテキスト(Contect)
    Kora Contectはnodeのrequestとreponseオブジェクトを単一のオブジェクトにパッケージ化し、WebアプリケーションとAPIを作成するために多くの有用な方法を提供しています.これらの操作はHTTPサーバの開発において頻繁に使われています.
    app.use(async ctx => {
      ctx; //    Context
      ctx.request; //    koa Request
      ctx.response; //    koa Response
    });
    
    便利さのために多くのコンテキストのアクセスと方法を直接にそれらのctx.requestまたはctx.reponseに委託します.ctx.typeとctx.lengthはrequestに委託します.
    ctx.req/Nodeのrequestオブジェクト.ctx.res/Nodeのレスポンスオブジェクト.
    コアラを迂回したレスポンスはサポートされていません.以下のnode属性を使用することは避けられます.res.status Code ress.writeHead()res.write()res.end()
    ctx.request koaのRequestオブジェクト.ctx.reponse koaのReponseオブジェクト.
    ctx.co okies.get(name,options)からcookie name:signedから要求されたcookieをoptionsで取得するには、署名されるべきctx.co okies.set(name,value,options)により、cookie nameのvalueを設定します.
  • maxAgeは、Date.now()から得られたミリ秒数
  • を表しています.
  • signed cookie署名値
  • expires cookie期限切れのDate
  • パス、デフォルトは'/'
  • です.
    request.headerはヘッダオブジェクトを要求する.request.header=リクエストヘッダオブジェクトを設定します.
    request.method要求方法.request.method=セットアップ要求方法は、methodOverride()などの中間デバイスを実現するために有用である.
    request.url取得要求URL.request.url=設定要求URLはurl書き換えに役に立ちます.
    request.origginはURLのソースを取得して、protocolとhostを含みます.ctx.request.orign/=>http://example.com
    request.hrefは、protocol、host、urlを含む完全な要求URLを取得する.koa-bodyrequest.pathは要求パス名を取得する.
    request.querystring根拠?元のクエリー文字列を取得します.
    request.type取得要求Content-Typeにはパラメータ「charset」が含まれていません.ctx.request.href;// => http://example.com/foo/bar?q=1request.queryは解析されたクエリー文字列を取得し、クエリ文字列がない場合は空のオブジェクトを返します.例えば「カラー=blue&size=small」:
    {
      color: 'blue',
      size: 'small'
    }
    
    request.accepts(type s)は、与えられたtype(s)が受け入れられるかどうかをチェックします.もしtrueなら、最適なマッチングを返します.そうでなければfalseです.
    レスポンスインデックス.headerはヘッダオブジェクトに応答します.
    レスポンス状態を取得します.デフォルトでは、レスポンス.statusは、nodeのres.status Codeのように200ではなく、404に設定されています.
    レスポンスメッセージ.レスポンスメッセージを取得します.レスポンスボディを取得します.
    reponse.redirectは[302]を実行してurlにリダイレクトする.
    レスポンスConttentt-Typeにはパラメータ「charset」が含まれていません.const ct = ctx.request.type;// => "image/png"レスポンスのConteet-Lengthをデジタルで返したり、ctx.bodyから導出したり、undefinedしたりします.
    初乗りピット
    プロジェクトジェネレータ:npm install-g koa-generatorは、あなたのワークディレクトリの下で、入力:koa 2ハローKooa 2プロジェクトの作成に成功した後、プロジェクトディレクトリに入り、npm installコマンドcd Hello 2 npm installプロジェクトを実行します:npm start
    koaはv 3版でgeneratorミドルへのサポートをキャンセルすると宣言していますので、長い間考えるためにはasync文法を使ったほうがいいです.function*文法を続けたいなら、koa-convertという中間部品を使って変換できます.
    const convert = require('koa-convert');
    app.use(convert(bodyparser));
    app.use(convert(json()));
    app.use(convert(logger()));
    
    Contectはnodeの中のrequestとreponseをカプセル化しました[email protected]を使用してConteextオブジェクトを参照します.
    app.use(function *(){
      this.body = 'Hello World';
    });
    
    [email protected]でctxを使用してContectオブジェクトにアクセスします.
    app.use(async (ctx, next) => {
      await next();
      ctx.body = 'Hello World';
    });
    
    プロジェクトの設定
    ここの配置は運行環境の配置を指します.例えば、開発段階で地元のデータベースを使って、テスト用のテストライブラリを使って、オンラインを発表する時にオンラインのライブラリを使って、異なるポート番号もあります.npm startは、package.jsonでscriptsオブジェクトに対応するstartフィールドの後ろの内容を実行します.
    npmでは、よく使われている4つの略語npm startがnpm run start npm stopです.npm run stopの略記npm testはnpm run testの略記npm retartです.npm run stop&npm retart&npm startの略記です.