ホームページ  >  記事  >  ウェブフロントエンド  >  Koa2_html/css_WEB-ITnose

Koa2_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-21 08:49:171701ブラウズ

Koa は自身を HTTP ミドルウェア フレームワークとして位置付けており、HTTP サーバーの作成に関連する共通のメソッドとプロパティを提供することに重点を置いています。ミドルウェア自体はバンドルされておらず、実際のベースに基づいてオープン ソース コミュニティによって開発されています。特定のミドルウェアを開発する必要があります。

Koa は、app.use() メソッドを使用してミドルウェアを登録し、注入順にミドルウェア配列に追加します。これらのミドルウェアは、キャッシュの生成、プロキシの指定、リダイレクトなどの HTTP リクエストの処理によく使用されます。待って。

const Koa = require('koa');const app = new Koa();// responseapp.use(ctx => {    ctx.body = 'Hello Koa';});app.listen(3000)

ミドルウェア

Koa2 は、次の 3 つのミドルウェア機能をサポートします。

// common function app.use((ctx, next) => {    const start = new Date();    return next().then(() => {        const ms = new Date() - start;        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);    });});// async functionapp.use(async (ctx, next) => {    const start = new Date();    await next();    const ms = new Date() - start;    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);});// generator function.use(co.wrap(function *(ctx, next) {    const start = new Date();    yield next();    const ms = new Date() - start;    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);}));

Node.js はまだ非同期関数をサポートしていないため、Babel を使用して JS ファイルをプリコンパイルする必要があります。私のアプローチは、依存関係 babel-core babel-polyfill babel-preset-es2015 babel-preset- をインストールすることです。 stage-0 を作成し、実際のエントリ ファイル (index.js など) の前に Babel をロードするように疑似エントリ ファイル (index.babel.js など) を設定します。将来、Node.js が Async をサポートするようになったら、このファイルを削除します。 :

require("babel-core/register")({    "presets": [        "es2015",        "stage-0"    ]});require("babel-polyfill");require('./index.js');

ミドルウェアは 2 つのパラメーター (ctx、next) を固定的に受け取ります。他のパラメーターを渡したい場合は、ミドルウェアを再パッケージ化できます。 🎜>

function logger(format) {    format = format || ':method ":url"';    return async function (ctx, next) {        const str = format            .replace(':method', ctx.method)            .replace(':url', ctx.url);        console.log(str);        await next();    };}app.use(logger());app.use(logger(':method :url'));

ミドルウェア koa-compose を使用して複数のミドルウェアをマージします:

const compose = require('koa-compose');async function random(ctx, next) {    // ...};async function backwards(ctx, next) {    // ...};async function pi(ctx, next) {    // ...};const all = compose([random, backwards, pi]);app.use(all);

エラー処理

Koa は、try-catch イベントや Error イベントなどのデフォルトのエラー処理メカニズムを提供します。 try-catch キャプチャをカスタマイズする推奨方法は次のとおりです:

app.use(async (ctx, next) => {    try {        await next();    } catch (err) {        err.status = err.statusCode || err.status || 500;        throw err;    }});

エラー イベントのリスニングをカスタマイズします:

app.on('error', (err, ctx) {    // ...});

Koa インスタンス

Koa のインスタンス アプリには次のプロパティが含まれます:

    app.name (オプション) はアプリケーションの名前を指定します
  • app.env、デフォルト値は NODE_ENV または "development"
  • app.proxy
  • app.subdomainOffset
  • app.context、Koa はこの名前空間の使用を推奨しますdata

app.context.db = db();

には次のメソッドが含まれます:

    app.listen()、リスニング ポートの設定
  • app.callback()
  • app.use()、ミドルウェアを挿入
  • app.keys=、署名付き Cookie のキーを設定
Context

各リクエストには Context オブジェクトがあり、これにはリクエストとレスポンスの 2 つのオブジェクトが含まれます。

app.use(async (ctx, next) => {    // Context    ctx;     // Request    ctx.request;     // Response    ctx.response; });

Context オブジェクトに含まれるプロパティ:

    ctx.req、Node.js のリクエスト オブジェクト
  • ctx.res、Node.js のレスポンス オブジェクト
  • ctx.request、koa のリクエストオブジェクト
  • ctx.response、koa の応答オブジェクト
  • ctx.state、この名前空間にグローバル状態をマウントすることをお勧めします
  • ctx.app、アプリケーション インスタンス
Context オブジェクトには次のメソッドが含まれています:

    ctx.cookies.get(name, [options])、get cookies
  • ctx 。 cookies.set(name, value, [options])、cookie の設定
  • ctx.throw([msg], [status], [properties])、スローエラー

ctx.throw('name required', 400);// 等同于const err = new Error('name required');err.status = 400;throw err;

Request

このオブジェクトは、ノードのネイティブな Request オブジェクトを再カプセル化したもので、次の読み取り専用属性が含まれています:

    request.href
  • request.stale
  • request.fresh、コンテンツが更新されたかどうかを判断します
  • request.origin
  • request.secure、 HTTPS プロトコルであるかどうかを確認する
  • request.charset
  • request.originalUrl
  • request.type、Content-Type
  • request.header を取得、同等request.headers
  • request.length に、リクエストヘッダ情報の Content-Length の値を返します。存在しない場合は、未定義の
  • request.host を返します。ホスト名とポート番号、app.proxy の値が true の場合、X-Forwarded-Host をサポート
  • request.protocol、app.proxy の値が true の場合、サポート true の場合、X-Forwarded-Host app.proxy の値が true の場合、X-Forwarded-Host
  • request.ip がサポートされます。proxy が true の場合のみ、X がサポートされます。 -Forwarded-Host リストが返されます。それ以外の場合は、空の配列
  • request.subdomains が返され、app.subdomainOffset に従ってサブドメイン名が返されます
  • には、次の読み取り可能および書き込み可能なものが含まれます属性:
  • request.url

request.path

    request.method
  • request.search
  • request.querystring
  • request.query
  • には次のメソッドが含まれます:
    • request.is(type...),判断 Content-Type的类型,如果不存在 request.body,返回 undefined;如果没有符合的类型,返回 false;存在符合的类型则返回响应的字符串
    • request.accepts(types)
    • request.acceptsEncodings(types)
    • request.acceptsCharsets(charsets)
    • request.acceptsLanguages(langs)

    // With Content-Type: text/html; charset=utf-8ctx.is('html'); // => 'html'ctx.is('text/html'); // => 'text/html'ctx.is('text/*', 'text/html'); // => 'text/html'// When Content-Type is application/jsonctx.is('json', 'urlencoded'); // => 'json'ctx.is('application/json'); // => 'application/json'ctx.is('html', 'application/*'); // => 'application/json'ctx.is('html'); // => false

    Response

    该对象是对 Node 原生 Response 对象的再封装,包含以下只读属性

    • response.socket
    • response.header,等同于 response.headers
    • response.headerSent,检查响应头是否已发送

    包含以下可读写属性:

    • response.stauts
    • response.message
    • response.length
    • response.body
    • response.type
    • response.lastModified
    • response.etag

    tx.response.etag = crypto.createHash('md5').update(ctx.body).digest('hex');

    包含以下方法:

    • response.get(field)
    • response.set(fields)
    • response.vary(field)
    • response.set(field, value)
    • response.append(field, value)
    • response.remove(field)
    • response.is(types...)
    • response.flushHeaders()
    • response.redirect(url, [alt])
    • response.attachment([filename]),将 Content-Disposition设为 attachment,并通知客户端下载资源
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。