我正在使用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);
干杯, 罗恩
答案 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);