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

发布于 2022-09-11 18:45:59 字数 500 浏览 28 评论 0

  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。想请教下大家为什么会这样,如果这种写法不可避免会出现这种问题,那么大家是怎么写的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

怕倦 2022-09-18 18:45:59

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

少钕鈤記 2022-09-18 18:45:59

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

我乃一代侩神 2022-09-18 18:45:59

好好看看 阮一峰的 es6 class吧

陌伤ぢ 2022-09-18 18:45:59

这是 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文