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

Separate router and controller in 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);

干杯, 罗恩

在 koa 中间件中,this 保留给 koa 上下文,没有其他方法可以访问请求和响应。因此,您不能使用 class 来定义您的控制器,因为 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);