ExpressJS子类缺少回调中的继承属性和属性

时间:2018-03-07 16:55:27

标签: javascript node.js class express inheritance

我在Node v8.9.4上使用ExpressJS 4.16,并创建了处理默认路由的基本控制器。以下是一个示例示例:

class BaseController {
  constructor(name, app, router, data) {
    this._name = name;
    this._app = app;
    this._router = router;
    this._data = data;

  }

   get name() {
    return this._name;
  }

  setup_aggregate_routes() {
     //Add Top Level Routes (All Entities)
    this._router
       .route(this.aggregate_route) // route = {application_root}/{entity}s/
       .get(this.get_aggregate_request)
  }

  default_request(req, res) {
    res.status(400).json(this.not_implemented_message);
  }

  get aggregate_route() {
    return `/${this.name}s`;
  }
  get_aggregate_request(req, res) {
    this.default_request(req, res);
  }
}

" this._router"是" express.router()"对象和" this._app"是一个明确的对象。 然后我继续从这个类继承。

const BaseController = require("./base");
class CatalogController extends BaseController {
  get_aggregate_request(req, res) {
    console.log(this._data);
    console.log(this.name);
    res.status(200).json();
  }
}

但是,当我在子类" CatalogController","这个"的get_aggregate_request回调中执行此操作时未定义。然后我继续替换"这个"用"超级"但是诸如" _data"等属性。不可用,"名称"调用getter但是当它使用this._name时它不可用。

我很难过为什么。任何帮助正确连接它将不胜感激。

修改 以下是如何使用super的示例:

const BaseController = require("./base");
class CatalogController extends BaseController {
  get_aggregate_request(req, res) {
    console.log(super._data);
    console.log(super.name);
    res.status(200).json();
  }
}

以下是如何实例化类的示例:

const catalog_controller = new CatalogController(
  "catalog",
  app,
  express.Router(),
  data.catalog
);

**其他信息** 为了解决这个问题,我简化了代码并从等式

中删除了Express

基础控制器:

class BaseController {
  constructor(
    name, data
  ) {
    this._name = name;
    this._data = data;
  }

  get name() {
    return this._name;
  }

  setup_aggregate_routes() {
    //Add Top Level Routes (All Entities)
    this.example_test_function(null, this._data, this.callback)
  }

  example_test_function(err, data, cb){
    cb(data);
  }

  callback(data){
    console.log(`${this.name}: ${JSON.stringify(data)}`);
  }

  default_request(req, res) {
    res.status(400).json(this.not_implemented_message);
  }

  get_aggregate_request(req, res) {
    this.default_request(req, res);
  }

}
module.exports = BaseController;

目录控制器(继承):

const BaseController = require("./base");

class CatalogController extends BaseController {
  callback(data) {
    console.log(`${this.name}: ${JSON.stringify(data)}`);
  }
}

module.exports = CatalogController;

驱动:

const BaseController = require("./base")
const base_controller = new BaseController("base",
{ a:"abc" }
)

base_controller.setup_aggregate_routes()

const CatalogController = require("./catalog");

const catalog_controller = new CatalogController(
    "catalog",
   { a:"abc" }
  );

catalog_controller.setup_aggregate_routes()

如果签名相同,则ES2015 / ES6不需要在子类构造函数中显式调用超级构造函数。子类最终使用基(超)类构造函数。所以这不是继承问题。然后我测试了上面的内容并遇到了类似的问题。它不是继承或Express的问题。这是旧的javascript上下文问题,使用" this"。

这是在此确定的。 How to access the correct `this` inside a callback?

根据最后确定的样本,如果我根据已确定的解决方案之一更改代码:

来自:

cb(data);

为:

cb.bind(this)(data);

有效。 我将使用ExpressJS提供完整的解决方案

2 个答案:

答案 0 :(得分:1)

此问题的解决方案与上下文,回调以及" this"的使用相关联。而不是继承问题也不是Express问题。 它在此标识:

How to access the correct `this` inside a callback?

如果我使用原始示例来解决此问题,我需要应用的唯一更改如下:

改变这个:

.get(this.get_aggregate_request)

对此:

.get(this.get_aggregate_request.bind(this))

当然还有其他方法可以解决文章中确定的上下文问题,但这最终取决于您。

答案 1 :(得分:0)

试试这个

class CatalogController extends BaseController {

    constructor(name, app, router, data) {
        super(name, app, router, data);
    }

    get_aggregate_request(req, res) {
        //super(req, res); // if you want to call
        res.status(200).json();
    }
}