Expressjs。从原型函数调用构造函数中的函数时的TypeError

时间:2017-06-29 06:48:33

标签: node.js express router

我试图从原型中调用构造函数中的函数但是继续得到以下错误,我不知道我的代码有什么问题。

TypeError: this.authorize is not a function

这是我的代码: controller.js

var Controller = function() {
    this.authorize = function(req, res) {
        if (!req.user) {
            res.redirect("/");
        }
    };
};
Controller.prototype.online = function(req, res) {
    this.authorize(req, res);
    res.render('./play/online');
};
var controller = new Controller();
module.exports = controller;

route.js

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

router.get('/online', controller.online);
module.exports = router;

如果我在Controller之外放置授权功能,那么我可以调用它,但我不想这样做。 那我该怎么办?

更新
当我应用请求" / online"时,在Nodejs中发生此错误,而不是在纯Javascript中

2 个答案:

答案 0 :(得分:1)

传递online作为回调

时,您正在丢失上下文
router.get('/online', controller.online.bind(controller));

或内部构造函数

var Controller = function() {
    this.authorize = function(req) {
        console.log(req);
    };

    this.online = this.online.bind(this);
};

答案 1 :(得分:0)

在Controller的原型上设置授权功能,就像使用在线功能一样。

编辑:我测试了您的代码(不使用Controller.prototype),它对我有用......

我可以在在线功能中调用授权。从在线功能调用授权时是否发生错误,或者是否在其他地方发生?你确定你的代码中没有拼写错误吗?

您是否可以尝试在构造函数中定义在线函数?



//Your initial version: works for me...

var Controller = function() {
    this.authorize = function(req) {
        console.log(req);
    };
};

Controller.prototype.online = function(text) {
    this.authorize(text);
};

var controller = new Controller();
controller.online("Some text");

//My prototype version: works as well...

var Controller2 = function() {};
Controller2.prototype.authorize = function(req) {
    console.log(req);
};

Controller2.prototype.online = function(text) {
    this.authorize(text);
};

var controller2 = new Controller2();
controller2.online("Some text2");