避免Node.js中的单例?

避免Node.js中的单例?,node.js,model-view-controller,express,sails.js,passport.js,Node.js,Model View Controller,Express,Sails.js,Passport.js,我读过好几次书,说应该尽量避免单身。我所说的单例是指这种代码 exports = module.exports = new Passport(); 此代码来自Node.js模块PassportJS。它允许我们使用passport并添加一些将在整个代码中共享的var 如您所见,我们可以制作以下代码: (这只是一个例子,我也是,我不怪任何人)。 请注意,他正在使用require文件顶部的passport,然后使用代码中先前添加的策略之一。显然这很方便,但这是最好的方法吗 是否无法从以前的代码在控制

我读过好几次书,说应该尽量避免单身。我所说的单例是指这种代码

exports = module.exports = new Passport();
此代码来自Node.js模块PassportJS。它允许我们使用passport并添加一些将在整个代码中共享的var

如您所见,我们可以制作以下代码: (这只是一个例子,我也是,我不怪任何人)。 请注意,他正在使用require文件顶部的passport,然后使用代码中先前添加的策略之一。显然这很方便,但这是最好的方法吗

是否无法从以前的代码在控制器内部传递passport变量

如果有什么不清楚,请告诉我


提前感谢。

有这样的情况,passport实例、express app实例、mongodb连接池、logger实例等,其中最常见的情况是每个节点进程一个实例。在这些情况下,如果模块还提供了一种简单的方法来访问和调用构造函数(例如,如果您的应用程序想要两个不同的连接池连接到两个不同的mongodb数据库,或者两个不同的日志流),那么单例可以很方便,并保持代码简洁

不过,这有时会给测试、模拟、存根等带来不便

是否无法从以前的代码在控制器内部传递passport var


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

是否有一个使用Passport对象的多个实例的用例?
exports=module.exports=…
是多余的<代码>模块.导出===导出
;它们被映射到同一个位置。而且,单身也可以。不知道你从哪里听说的。单身只是一种设计模式;像任何设计模式一样,它们不是天生的好或坏,它们只是。如果它们对应用程序有意义,那么就应该使用它们。Dan D,没有用例,它只是关于singleton的一个例子。Qix,我在stackoverflow上听到的。谢谢你的解释:)。谢谢你的回答,你的回答非常清楚,但只是对你强调的我的部分的精确性。我想说的是,有没有一种方法可以正确地编写这种代码<代码>//在控制器之前var passport=require('passport');`<代码>//做一些事情
//控制器内部
auth:function(req,res,next){
`var passport=req.app.passport;`/…我不知道您是否明白我的意思:)是的,您可以通过connect/express应用程序中的
req
res
app
对象共享对象。在这种特定情况下,这只是另一种实现与拥有多个文件相同功能的方法需要passport并对其进行操作。不确定你到底在问什么,但总是一个带有实际工作代码的特定问题比一般/模糊/无代码问题更容易讨论。