2017-01-16 9 views
0

기본적으로 각 경로 이름 (즉, things.js)에 대한 파일이 있습니다. 각 파일에 똑같은 내용이 있습니다.이 루트 파일 (koa @ next-v2)을 ES6을 사용하여 상속 된 클래스로 변환하려면 어떻게해야합니까?

나는 특정 경로 파일 여기 things.js

각 요청 메소드 타입을 오버라이드 (override) 할 수있는 능력의 기본을 수행 base.js에 기본 Route 클래스를 만들 ES6 클래스를 사용하려면

things.js 경로 파일은 다음과 같습니다

'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 {}을 입력하고 싶습니다.

메서드에 대해서는 상속을 할 수 있지만 상속 모델에서이 라우터 정의를 처리하는 방법을 잘 모르겠습니다.

당신이 단지 기능을 usig,하지만 당신은 클래스를 요구하기 때문에 달성 할 수

답변

-1

...

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

"정말 아무것도 상속하지 않는다"는 것이 무슨 뜻인지 잘 모르겠습니다. 아마도 당신이 성취하고자하는 것을 구체적으로 설명한다면 나는 더 많은 도움이 될 수 있습니다. 내 대답에 표시된 기본 클래스를 확장하여 특정 경로에 대해 다른 동작을 설정하는 방법을 질문했습니다. 함수 주석에 대해서는 "함수"대신 "기능적으로"말 했어야합니다. 클래스 기반 솔루션이 과도하게 사용된다는 데 동의하기 때문에 언급했지만, 특별히 요구 한 것입니다. –