繁体   English   中英

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

[英]Calling a Node.js module function from within the module

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

考虑以下代码:

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");
}

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

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

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

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,
}

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

好吧,让我们来证明这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该功能。 所以你应该这样做;

 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); 

你将需要添加this对您的调用World() -

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM