如何导出需要分配的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议吗?
我会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来导出函数处理程序。