从模块内调用Node.js模块函数

时间:2017-08-20 16:09:05

标签: javascript node.js module node-modules

我尝试编写节点模块以清理代码并将其分成不同的文件。

考虑以下代码:

module.exports = {
    Hello : function(request, reply) {
        return reply("Hello " + World());
    },
    World : function() {
        return "World";
    }
}

如果我导入上面的模块并使用Hello函数作为特定路由的处理程序,我会收到HTTP 500内部服务器错误。

如果我将Hello函数更改为

,我已将问题缩小到调用World()
Hello : function(request, reply) {
    return reply("Hello World");
}

然后它工作正常,所以当从导出对象中调用另一个函数时它似乎被绊倒了

有谁知道为什么会这样,以及如何解决它?

3 个答案:

答案 0 :(得分:4)

您应该按如下方式调用它:

module.exports = {
    Hello: function(request, reply) {
        return reply("Hello " + module.exports.World());
    },
    World: function() {
        return "World";
    }
}

如果您的目标是更清晰的代码,我建议您将代码更改为:

function World() {
  return "World";
}
function Hello(request, reply) {
  return reply("Hello " + World());
}
module.exports = {
    Hello,
}

这将使您的代码更具可读性,您只会导出实际需要的内容。这个question还有其他解决方案。

答案 1 :(得分:3)

让我们展示this

this没有定义函数所在的对象。它定义了调用函数的位置。所以,虽然;



var obj = {
    Hello : function(request, reply) {
        return reply("Hello " + this.World());
    },
    World : function() {
        return "World";
    }
};
obj.Hello("test", console.log);




会工作得很好;这不会



var obj = { Hello : function(request, reply) {
                      return reply("Hello " + this.World());
                    },
            World : function() {
                      return "World";
                    }
          };

setTimeout(obj.Hello,100,"test",console.log);




这只是因为obj.Hello将在setTimeOut函数的定义中分配一个参数,并且该参数将被调用为window作为this的{​​{1}}那个功能。所以你应该这样做;



var obj = { Hello : function(request, reply) {
                      return reply("Hello " + this.World());
                    },
            World : function() {
                      return "World";
                    }
          };

setTimeout(obj.Hello.bind(obj),100,"test",console.log);
//or 
setTimeout(obj.Hello.bind(obj,"test",console.log),100);
//or
setTimeout((x,y) => obj.Hello(x,y),100,"test",console.log);




答案 2 :(得分:2)

您需要在调用this -

时添加World()
module.exports = {
    Hello : function(request, reply) {
        return reply("Hello " + this.World());
    },
    World : function() {
        return "World";
    }
}

World是导出对象的属性,而不是可访问范围内的变量 - 因此您需要指定该函数属于this