我的情况是我需要在索引文件中要求一个名为Router的模块,同时为模块的变量赋值。
我已经找到了实现它的几种方法。但是,作为初学者,我想知道哪一个是最佳实践或设计,为什么不能使用其他。
方法1 - 导出setter&保持变量为'私人'
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 - 让变量为'public'并使用'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();
我应该使用以上哪一个?建议使用其他任何方法吗?
答案 0 :(得分:0)
我会建议方法3,它是一个回调;非阻塞代码。而且,它接近我看似自然的东西!
答案 1 :(得分:0)
我喜欢这样做 - 我建议尝试远离那些带有模块的处理程序,因为它是一个复杂的陷阱,有一天会抓住你,也就是说,除非你需要它们。)
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 :(得分:0)
也可以使用方法2。如果您正在使用aws lambda,您将看到他们使用方法2来导出函数处理程序。