对象内部的函数不是函数

时间:2016-09-01 10:51:36

标签: javascript node.js

这是我的对象

var Controller = (function () {
    var self = this;
    self.get = function (req, res) {
        res.send({
            success: 'you got me'
        });
    }
    return self;
})()
module.exports = Controller;

以下是我试图将参数从另一个文档传递给get函数的方法。

var Controller = require('../Controller.js');
Controller.get(arg1, arg2);

然而,nodejs抛出' TypeError:Controller.get不是函数',我在这里做错了什么?感谢

1 个答案:

答案 0 :(得分:4)

该代码存在多个问题,但不会导致您描述的TypeError: Controller.get is not a function

您调用创建Controller的匿名函数的方式意味着其中的this将是全局对象(松散模式)或undefined(严格模式)。让我们假设是松散模式,因为您没有说过您将get分配给undefined时出错。这意味着您正在创建名为get全局功能。这也意味着Controller返回全局对象。

这些都不是好事。 : - )

如果您想要导出具有get功能的对象,您不需要做任何近乎复杂的事情:

var Controller = {
    get: function (req, res) {
        res.send({
            success: 'you got me'
        });
    }
};
module.exports = Controller;

或者

function get() {
    res.send({
        success: 'you got me'
    });
}

module.exports = { get: get };

由于这是在NodeJS模块的上下文中,因此没有定义全局函数(模块在私有范围内调用)。

,如果您认为Controller构造函数,则需要通过new调用它并稍微重新组织:< / p>

function Controller() {
    var self = this; // If you need it for something, you don't in your example
    self.get = function get() {
        res.send({
            success: 'you got me'
        });
    };
}

module.exports = Controller;

然后通过new

使用它
var Controller = require('./.Controller.js');

var c = new Controller();
c.get("foo", "bar");

它也可能值得指出require('../Controller.js')使用目录中的Controller.js文件,而不是当前目录。如果您没有故意,并且因为您收到了错误的文件而导致TypeError: Controller.get is not a function获得了{。}}。