我在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提供完整的解决方案
答案 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();
}
}