フルスタックアイテム|小さな本棚|グローバルルーティングサーバーの開発を達成-Koa

ルーティングとは何ですか

ルーティングは、特定の機能モジュールに特定のアクセス・パスです。apiインタフェースはによって実装されip(域名)+端口号、例えば、で構成+パスは:https://www.npmjs.com/package/koa-routerのルート点であるページ。koa-routernpm

なぜ我々はKOA-ルータのルートが必要なのか

もちろん、あなたがする必要はありませんkoa-routerでも、ルーティング機能を実装してctx.request.pathパスを指定するために実装します。例としては、次のとおりです:

const koa = require('koa2')
const app = new koa()

app.use(async (ctx, next) => {
    if (ctx.request.path === '/') { // 首页
      ctx.response.status = 200
      ctx.response.body = 'index'
    } else if (ctx.request.path === '/list') { // 列表页
      ctx.response.status = 200
      ctx.response.body = 'list'
    } else {
        ctx.throw(404, 'Not found') // 404
    }
  await next()
})

app.listen(3000)

参考:興亜ルート

上記のコードは2つのインターフェイスのみを実装し、コード書かれた判決の多くを書く多層コードの可読性が悪いされているし、どのように行うには、この時間?

上記のコードは、ミドルウェアを通じて達成するために邪魔に抽出することが可能とされていません。

結果は可能であるが、koa-routerまさにそれをやりました。使用してkoa-router、以下の実施例を:

  1. app.js入り口
  2. URLをルーティング/ home.jsホームページ

app.js コードは以下の通りです

// 路由模块使用前需要先安装和实例化
const Router = require('koa-router')
const router = new Router()

// 首页
app.use(async (ctx, next) => {
    if (ctx.request.path === '/') {
      ctx.response.status = 200
      ctx.response.body = 'index'
    }
    await next()
})

// 其他页面通过 router 加载
let urls = fs.readdirSync(__dirname + '/urls')
urls.forEach((element) => {
    let module = require(__dirname + '/urls/' + element)
    /*
      urls 下面的每个文件负责一个特定的功能,分开管理
      通过 fs.readdirSync 读取 urls 目录下的所有文件名,挂载到 router 上面
    */
    router.use('/' + element.replace('.js', ''), module.routes(), module.allowedMethods())
})
app.use(router.routes())

urls/home.js コードは以下の通りです

const Router = require('koa-router')
const home = new Router()

// /home
home.get('/', async (ctx, next) => {
    ctx.response.status = 200
    ctx.response.body = 'home'
    await next()
})

// home/list
home.get('/list', async (ctx, next) => {
    ctx.response.status = 200
    ctx.response.body = 'home-list'
    await next()
})

module.exports = home

上記のコードは基本的に達成されたことで全局路由的功能、残りはで取得することでurls次のパッケージに対応するファイルを作成するために、参照がhome.js可能。

しかし、コードは、ここではまだ完璧ではないapp.jsエントリー文書、ここではコードまたはもう少しとして;および首页和homeルーティングを達成するために別のものです。そして、urlsパスが固定され、フォルダ名または場所の変更問題が発生します従ってください。

それでは、どのようにそれを達成していますか?
ここでの考え方です。

  1. app.jsコードは、抽出されたようにapp.js、できるだけシンプル
  2. ホームページや他のページは、グローバルルートで実装されています

グローバルルーティングを実現するエレガント

npm導入必要-ディレクトリを

require-directory npmパッケージが便利です。

再帰的に)(各ファイルのために必要とされ、指定されたディレクトリをトラバース

ここで達成するために、このパッケージの利点があります。特定以下を達成。

  1. core作成ディレクトリInitManager.js
const requireDirectory = require('require-directory')
const Router = require('koa-router')
/**
* 加载全局路由
*/
static initLoadRouters(app){
   // 加载工作目录下的 app/api 下的路径
   const apiDirectory = `${process.cwd()}/app/api`
   
   // 参数:第一个参数固定参数module
   // 第二个参数要加载的模块的文件路径
   // 第三个参数:每次加载一个参数执行的函数
   requireDirectory(module, apiDirectory, {
       visit: whenLoadModule
   })
   
   function whenLoadModule(obj) {
       if(obj instanceof Router ){
           app.use(obj.routes())
       }
   }
}

module.exports = InitManager

実装が使用ここで見ることができ、上からprocess.cwd()を通じて取得パスを、そして元のコード__dirnameのパスを取得するには、両方のどのような違いは、それをしませんか?

NodeJs現在実行ファイルコマンドときにフォルダの場所-作業ディレクトリ、別のディレクトリ内のファイルの実施を確保するため、パスは常に同じで実行されるファイル・ディレクトリ-アドレスファイルprocess.cwd()__dirname
process.cwd()node
__dirnamejs

  1. ではapp.js、この方法でロードすることができます。
const app = new Koa()
InitManager.initLoadRouters(app)

3. app/api適切なインターフェイスファイルの下では、作成することができ、このようなhome.js

アドバイスマイクロ文字を追加してください:光がいじめます。
ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/gdragon/p/11802511.html