gpt4 book ai didi

node.js - 避免 Node.js 中的单例?

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:31 27 4
gpt4 key购买 nike

我已经读过好几次了,应该尽可能避免使用单例。我所说的单例是指这种代码

exports = module.exports = new Passport();

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

如您所见,我们可以编写以下代码: https://github.com/ragulka/sails-starter-app/blob/master/api/controllers/SessionController.js(这只是一个例子,我也是这样做的,我不怪任何人)。请注意,他正在使用 require 在文件顶部获取 Passport ,然后使用之前在代码中添加的策略之一。显然这很方便,但这是最好的方法吗?

是否无法从以前的代码中传递 Controller 内的 Passport 变量?

如果有不清楚的地方,请告诉我。

提前致谢。

最佳答案

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

但这有时对于测试、模拟、 stub 等来说可能会很不方便。

Is there no way to pass passport var inside controllers from previous code ?

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

关于node.js - 避免 Node.js 中的单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27220604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com