2017-01-16 26 views
0

我基本上有一个文件为每个路由名称(即:things.js) 在每个文件中完全相同的东西。如何将此路线文件(koa @ next - v2)转换为使用ES6的继承类?

我想用ES6班base.js,做默认与覆盖在特定的路由文件things.js

这里,每个请求的方法类型的能力,以创建一个基Route类是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

我不确定你的意思是“没有继承任何东西”。也许如果你更具体地解释你想达到的目标,我可能会有更多的帮助。你问了如何通过扩展基类来为特定的路由设置不同的行为,我的答案显示。至于功能评论,我应该说“功能”而不是“功能”。我提到它是因为我同意基于类的解决方案是过度的,但这是你特别要求的。 –