如何导出需要赋值的Node.js模块

时间:2014-07-07 17:36:44

标签: javascript node.js

我的情况是我需要在索引文件中要求一个名为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();

我应该使用以上哪一个?建议使用其他任何方法吗?

3 个答案:

答案 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来导出函数处理程序。