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

Javascript 如何导出需要分配的Node.js模块,javascript,node.js,Javascript,Node.js,我的情况是,我需要在索引文件中要求一个名为Router的模块,同时为该模块的变量赋值 我想出了几种方法来实现它。然而,作为一个初学者,我想知道哪一个是最佳实践或设计,为什么不能使用其他的 方法1-将setter和keep变量导出为“private” 路由器.js var handler; exports.setHandler=function(h){handler=h}; exports.route=function(){console.log(handler)} exports.handle

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

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

方法1-将setter和keep变量导出为“private”

路由器.js

var handler;
exports.setHandler=function(h){handler=h};
exports.route=function(){console.log(handler)}
exports.handler={}; //not necessary
exports.route=function(){console.log(this.handler)}
module.exports=function(handler){
  return {route:function(){console.log(return handler)}};
}
index.js

var router=require('./router');
router.setHanlder('test');
router.route();
var router=require('./router');
router.hanlder='test';
router.route();
var router=require('./router')('test');
router.route();
方法2-将变量设为“public”,并使用“this”来引用

路由器.js

var handler;
exports.setHandler=function(h){handler=h};
exports.route=function(){console.log(handler)}
exports.handler={}; //not necessary
exports.route=function(){console.log(this.handler)}
module.exports=function(handler){
  return {route:function(){console.log(return handler)}};
}
index.js

var router=require('./router');
router.setHanlder('test');
router.route();
var router=require('./router');
router.hanlder='test';
router.route();
var router=require('./router')('test');
router.route();
方法3-导出工厂函数以接收作为参数的值

路由器.js

var handler;
exports.setHandler=function(h){handler=h};
exports.route=function(){console.log(handler)}
exports.handler={}; //not necessary
exports.route=function(){console.log(this.handler)}
module.exports=function(handler){
  return {route:function(){console.log(return handler)}};
}
index.js

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

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

我建议使用方法3,即回调;非阻塞代码。而且,它接近于我认为自然的东西

我喜欢这样做-我建议尽量避免使用模块这样的处理程序,因为这是一个复杂的陷阱,总有一天会抓住你,除非你需要它们=)

然后在使用文件中

var Router = require('router.js');

var router = new Router({/* options */});

router.route();

也可以使用方法2。如果您使用的是aws lambda,您将看到他们使用方法2导出函数处理程序。

这取决于:如果您在多个其他模块中需要该模块,那么每个模块是否都可以使用自己的处理程序,或者该处理程序是共享的,而设置最后一个处理程序的人将获胜?@FelixKling,我希望它们每个都有自己的处理程序,我想我所有的解决方案都是这样工作的。如何让他们共享一个处理程序?选项1和2只允许对需要您的模块的所有模块使用一个处理程序。请记住,模块只进行一次计算,因此无论何时更改模块内部的局部变量或模块的属性,都会影响所有调用站点。