如何导出需要分配的Node.js模块

我的情况是,我需要在我的索引文件中需要一个名为Router的模块,同时为模块的variables赋值。

我已经想出了几个方法来实现它。 但是,作为初学者,我想知道哪一个是最佳实践或devise,为什么不能使用其他的。

方法1 – 导出一个setter&保持variables为'private'

router.js

var handler; exports.setHandler=function(h){handler=h}; exports.route=function(){console.log(handler)} 

index.js

 var router=require('./router'); router.setHanlder('test'); router.route(); 

方法2 – 让variables为“公开”,并使用“this”来引用

router.js

 exports.handler={}; //not necessary exports.route=function(){console.log(this.handler)} 

index.js

 var router=require('./router'); router.hanlder='test'; router.route(); 

方法3 – 导出工厂函数以接收值作为参数

router.js

 module.exports=function(handler){ return {route:function(){console.log(return handler)}}; } 

index.js

 var router=require('./router')('test'); router.route(); 

我应该使用哪一个? 还有其他方法build议吗?

       

网上收集的解决方案 "如何导出需要分配的Node.js模块"

我会build议方法3,它是一个callback;非阻塞代码。 另外,它接近我自然的东西!

我喜欢这样做 – 我build议尽量远离模块这样的处理程序,因为这是一个复杂的陷阱,有一天会抓住你,也就是说,除非你需要它们=)。

 module.exports = function( options ) { // set options // based on options set vars and functions on this if (options.test === true) this.route = function() {//....} else this.route = function() {//......} } 

然后在使用文件中

 var Router = require('router.js'); var router = new Router({/* options */}); router.route(); 

也可以使用方法2。 如果你正在使用aws lambda,你会看到他们使用方法2来导出函数处理程序。