2017-01-16 8 views
0

У меня в основном есть файл для каждого имени маршрута (то есть: things.js) То же самое в каждом файле.Как включить этот файл маршрутов (koa @ next-v2) в класс с наследованием с использованием ES6?

Я хочу использовать классы ES6 для создания базового класса Route в base.js, что делает по умолчанию с возможностью переопределения каждого типа метода запроса в конкретном маршруте файл things.js

Вот файл 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 {}, если я хочу что-то изменить для этого конкретного маршрута.

Я могу наследовать, когда дело доходит до методов, но не уверен, как я буду обращаться с этими определениями маршрутизаторов в модели наследования.

ответ

-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

Я не уверен, что вы подразумеваете под «не наследуя ничего действительно». Возможно, если вы более конкретно объясните, чего вы пытаетесь достичь, я мог бы помочь. Вы спросили, как вы можете установить разные типы поведения для определенного маршрута, расширив базовый класс, который показывает мой ответ. Что касается комментария функции, я должен был бы сказать «функционально» вместо «функции». Я упомянул об этом, потому что согласен с тем, что решение на основе класса перегружено, но это то, о чем вы специально попросили. –

 Смежные вопросы

  • Нет связанных вопросов^_^