关于 koa2 路由使用 class 编写 controller 出现 this 为 undefined 的情况

YOUNGmaxer
  • 16
  1. 使用 koa2 路由

    const myClass = require('../controllers/myClass);   
    
    router.get('/api/a', myClass.getA);
  2. 使用 class 编写 controller

    class MyClass {
      constructor() {
        this.a = 'xxx';
      }
      
      getA(ctx) {
        ctx.body = this.a;
      }
    }
    
    module.exports = new MyClass();

我简单模拟了一下我的代码场景,然后就发现这样使用路由会出现错误 TypeError: Cannot read property 'a' of undefined。想请教下大家为什么会这样,如果这种写法不可避免会出现这种问题,那么大家是怎么写的?

回复
阅读 3.4k
4 个回答

这是 js 基础问题,this 指向问题;

当路由进入后,你的 'getA' 是一个函数,此时 this 指向全局(非严格模式),undefined(严格模式);

四种解决方案 :
1,router.get('/api/a', myClass.getA.bind(myClass))

2,router.get('/api/a', ctx => myClass.getA(ctx))

3,

class BaseController {  
    resolve(fn){  
        return this[fn].bind(this)  
    }  
}
class MyClass extends BaseController {
  constructor() {
    super();
    this.a = 'xxx';
  }
  
  getA(ctx) {
    ctx.body = this.a;
  }
}

module.exports = new MyClass();
const myClass = require('../controllers/myClass);   

router.get('/api/a', myClass.resolve('getA'));

4,

class BaseController {  
    resolve(){  
        return new Proxy(this, {  
            get(target, name) {  
                return target[name].bind(target)  
            }  
        })  
    }  
}
class MyClass extends BaseController {
  constructor() {
    super();
    this.a = 'xxx';
  }
  
  getA(ctx) {
    ctx.body = this.a;
  }
}

module.exports = new MyClass().resolve();
const myClass = require('../controllers/myClass);   

router.get('/api/a', myClass.getA);
CDXwangwang
  • 1
新手上路,请多包涵

你好,我也遇到了这个问题,想请问下你是怎么解决的呢?

我也遇到这问题了,楼主解决了吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏