在koa中分离路由器和控制器

时间:2015-07-03 00:23:18

标签: node.js koa

我正在使用koa,我想分离路由器设置和控制器,但对“this”感到困惑。

let app = require('koa')();
let router = require('koa-router')();

class Controller {
    constructor () {
        this.users = ['ron', 'jack'];
    }

    getUsersFromDb() {
        return this.users;
    }

    * getUsers () {
        let users = this.getUsersFromDb(); // failed here, "this" is not the class instance
        this.body = users; // here "this" is the koa context;
    }
}

let controller = new Controller();

router.get('/users', controller.getUsers)

app
    .use(router.routes())
    .use(router.allowedMethods())
    .listen(3000);

干杯, 罗恩

1 个答案:

答案 0 :(得分:4)

在koa中间件中,this保留给koa上下文,并且没有其他方法可以访问请求和响应。因此,您无法使用类来定义控制器,因为this已经为其他内容保留了。但是,您可以利用闭包并使用工厂函数:



let app = require('koa')();
let router = require('koa-router')();

var ControllerFactory = function(config){
    // config used instead of constructor parameters
    
    // Define properties and functions
    var users = ['ron', 'jack'];

    function getUsersFromDb() {
        return users;
    }

    function * getUsers () {
        let users = getUsersFromDb(); 
        this.body = users; 
    }
    // Export what you need
    return {
        getUsers: getUsers,
        users: users
    }
}

let controller = ControllerFactory({foo:'bar'});

router.get('/users', controller.getUsers)

app
    .use(router.routes())
    .use(router.allowedMethods())
    .listen(3000);