在Node.js中避免使用单例?

时间:2014-12-01 01:37:10

标签: node.js model-view-controller express sails.js passport.js

我已多次读过应尽量避免使用单身人士。单身我是指这种代码

exports = module.exports = new Passport();

此代码来自Node.js模块PassportJS。它允许我们使用护照并添加一些将在我们的整个代码中共享的var。

因此,您可以看到我们可以制作此代码: https://github.com/ragulka/sails-starter-app/blob/master/api/controllers/SessionController.js (这只是一个例子,我也这样做,我不责怪任何人)。 请注意,他使用require在文件顶部取出护照,然后使用之前在代码中添加的策略之一。显然它很方便,但这是最好的方法吗?

是否无法通过以前的代码在控制器内传递护照变量?

如果不清楚,请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:4)

有这样的情况,一个护照实例,一个快速应用程序实例,一个mongodb连接池,一个记录器实例等,其中最常见的情况是每个节点进程一个实例。在这些情况下,单例可以很方便并保持代码简洁,前提是该模块还提供了一种简单的方法来访问和调用构造函数,以满足您需要多个实例的少数时间(例如,如果您的应用程序需要2个不同的连接池例如,2个不同的mongodb数据库,或2个不同的日志流。

这有时会对测试,模拟,存根等造成不便。

  

是否无法通过以前的代码在控制器内部传递护照var?

是的,有。执行var passport = require("passport");时,您将始终返回完全相同的单例实例,包括应用程序中其他代码配置的所有内部状态。这是由于节点require调用中发生的缓存。需要额外代码的是,如果要创建新的不同Passport实例,在这种情况下,您需要自己调用构造函数。