2017-01-16 10 views
0

私は基本的にそれぞれのルート名(すなわち:things.js)のファイルを持っています 各ファイルにまったく同じものを使っています。ES6を使用してこのルートファイル(koa @ next-v2)を継承したクラスにするにはどうすればよいですか?

私はここで、特定のルートファイルにthings.js

を各要求メソッドのタイプを上書きする能力を持つデフォルトはthings.jsルートファイルでないことbase.jsに基本Routeクラスを作成するES6クラスを使用します:

'use strict'; 

const path = require('path'); 
const fs = require('fs'); 
const name = path.basename(__filename, '.js'); 

const Router = require('koa-router'); 
const Controller = require(`../controllers/${name}`); 
const controller = new Controller(); 

const router = new Router({ prefix: `/${name}` }); 

router.get('/', controller.getAll.bind(controller)); 
router.post('/', controller.post.bind(controller)); 
router.get('/:id', controller.get.bind(controller)); 
router.put('/:id', controller.put.bind(controller)); 
router.patch('/:id', controller.patch.bind(controller)); 
router.delete('/:id', controller.delete.bind(controller)); 

module.exports = router; 

どういうわけか私は上記のコードをRoute.jsにしてから、その特定のルートのために何かを変更したい場合はclass Things extends Route {}にします。

メソッドに関しては継承はできますが、継承モデルでこれらのルータ定義をどのように処理するかはわかりません。

答えて

-1

あなただけの機能をusigが、あなたは...クラスの

const path = require('path'); 
const fs = require('fs'); 
const Router = require('koa-router'); 

class Route { 
    constructor(name) { 
     const Controller = require(`../controllers/${name}`); 
     const controller = new Controller(); 
     const router = new Router({ prefix: `/${name}` }); 
     router.get('/', controller.getAll.bind(controller)); 
     router.post('/', controller.post.bind(controller));  
     router.get('/:id', controller.get.bind(controller)); 
     router.put('/:id', controller.put.bind(controller)); 
     router.patch('/:id', controller.patch.bind(controller)); 
     router.delete('/:id', controller.delete.bind(controller)); 
    } 
} 

module.exports = Route; 

を尋ねたので、次に、あなたの実際のルートは自分のファイルに定義することができ、これを実現することができます:で

const Route = require('./route'); 
const name = path.basename(__filename, '.js'); 
class SomeRoute extends Route {} 

このフォームでは、コンストラクタ全体をオーバーライド/補完することしかできないので、get()ルートだけの動作をオーバーライドしたい場合は、コンストラクタをクラスメソッドに分割します。

class Route { 
    constructor(name) { 
     const Controller = require(`../controllers/${name}`); 
     this.controller = new Controller(); 
     this.router = new Router({ prefix: `/${name}` }); 

     this.setupGet(); 
     this.setupPost(); 
     this.setupPut(); 
     this.setupPatch(); 
     this.setupDelete(); 
    } 

    setupGet() { 
     router.get('/', controller.getAll.bind(controller)); 
     router.get('/:id', controller.get.bind(controller)); 
    } 

    setupPost() { 
     router.post('/', controller.post.bind(controller));  
    } 

    setupPut() { 
     router.put('/:id', controller.put.bind(controller)); 
    } 

    setupPatch() { 
     router.patch('/:id', controller.patch.bind(controller)); 
    } 

    setupDelete() { 
     router.delete('/:id', controller.delete.bind(controller)); 
    } 
} 

あなたの個々のルートでは、setupGet()をオーバーライドし、他のハンドラをそのままにしておくことができます。

+0

これは基本クラスから実際に何かを継承しているわけではないので、これはあまり良いことではありません。また、代わりにどのように関数でこれを行うことができますか?私はES6クラスを使用することに結婚していない、ちょうどそれがデフォルトのセットをオーバーライドする最も簡単な方法だろうと思った。 – chovy

+0

「本当に何かを継承しない」という言い方が分かりません。多分あなたが達成しようとしていることを具体的に説明すれば、私はもっと助けになるかもしれません。私の答えが示す基本クラスを拡張することによって、特定のルートに対して異なる動作を設定する方法を尋ねました。関数のコメントについては、「関数」ではなく「機能的に」と言わなければなりません。私はクラスベースの解決策がうまくいくことに同意するので、私はそれを言いましたが、それはあなたが具体的に求めているものです。 –

関連する問題