`this`在expressJS路由处理程序中未定义

Igg*_*ggY 11 javascript node.js express

groups.js

class groupsCtrl {
  constructor() {
    this.info = "test";
  }

  get(res, req) {
    console.log("LOG ! ", JSON.stringify(this));
  }
}
module.exports = new groupsCtrl(); //singleton
Run Code Online (Sandbox Code Playgroud)

routes.js

var express = require('express');
var router = express.Router();

var groupsCtrl = require('controllers/api_admin/groups.js');
router.get('/groups/', groupsCtrl.get);
Run Code Online (Sandbox Code Playgroud)

这个日志 LOG ! undefined

如何this在我的控制器类中访问?

rob*_*lep 21

您需要将方法绑定到实例.

一个解决方案

router.get('/groups/', groupsCtrl.get.bind(groupsCtrl));
Run Code Online (Sandbox Code Playgroud)

另一种方案:

constructor() {
  this.info = "test";
  this.get  = this.get.bind(this);
}
Run Code Online (Sandbox Code Playgroud)

或者使用类似的东西es6bindall(基本上和上面的代码一样,但是当你需要绑定多个方法时可能会更有用).

  • @IggY,只有当你没有传递上下文时才需要显式绑定它,就像这里`router.get('/ groups /',groupsCtrl.get)`你只传递某种`函数'的参考groupsCtrl .get'`,没有它的上下文,因此,如果你_want_在特定上下文中调用该函数,你应该用`groupsCtrl.get.bind(groupsCtrl)`手动附加它.这就像在oop c-like语言中调用class-method并传递方法指针时传递隐藏的`self` ... (6认同)

小智 6

class groupsCtrl {
    constructor() {
        this.info = 'test';
    }

    get = (res, req) => {
        console.log('LOG ! ', JSON.stringify(this));
    };
}
Run Code Online (Sandbox Code Playgroud)

您可以只使用箭头函数来避免样板代码