【问题标题】:Best approach to passing variables between multi-file Node.js modules?在多文件 Node.js 模块之间传递变量的最佳方法?
【发布时间】:2018-09-10 17:53:34
【问题描述】:

到目前为止,我有一个 Node.js 模块,我将其保存为单个文件。虽然它变得相当大,并且其中有很多功能,可以更好地分离到其他模块中。例如,将日志记录初始化和功能分离到它自己的模块中。

我的模块有很多(我想说“全局”但不是真的)顶级变量,许多不同的函数可以访问、使用和修改这些变量。如果我将功能分离到单独的文件/模块中并要求它们进入我的主模块,那么在模块之间传递这些变量的正确方法是什么?

例如,将所有内容都放在一个模块/文件中,这样做很容易:

const logger = (log, message) {........}

const makeRequestHandler = (url, filepath) {
    ....
    logger.info('some message here')
    ....
}

因此访问像logger 这样的顶级系统非常容易。但是,如果我决定将我的 loggermakeRequestHandler 拆分为它们自己的模块/文件,我将如何处理呢?

let logger = require('./mylogger') // Custom module
let makeRequest = require('./makerequest') // Another custom module

makeRequest.handler(url, filepath, logger)

这可行,但看起来并不优雅或最佳。如果我需要传入很多不同的变量,那就更奇怪了:

makeRequest.handler(url, filepath, logger, profiler, reportingBuffer, compressionHandler)

我也考虑过在需要时将东西传递到模块中:

let makeRequest = require('./makeRequest')(logger)

或者更好:

let makeRequest = require('./makeRequest')(this) // I can access all variables made in my primary/top-level module

这里有没有更合适、更好/更容易维护的方法?最后一种是最好的方法吗?

【问题讨论】:

  • 依赖注入是在模块之间传递变量/依赖的常用方法。您还可以尝试控制反转 (ioc),例如服务定位器/服务提供者模式。您将拥有一个单例对象,该对象将保存需要使用的变量

标签: javascript node.js variables module node-modules


【解决方案1】:

cmets 中指出的全局定位器模式或服务定位器/服务提供者模式怎么样,您可以拥有类似于服务注册表的东西,并将这些服务包含在您想要使用它们的任何模块中。

虽然我不确定是否是所有解决方案中的最佳解决方案,但与在模块周围传递 this 上下文相比,它更易于实施并且感觉是一个更简洁的解决方案。

//logger.js
const logger = (log, message) {........}
export logger

现在,您可以在应用文件中初始化记录器和其他服务实例并将它们注册到全局定位器中

 let logger = require('./mylogger') // Custom module
 init() {
    //init and set the logger 
    global.logger = new logger();
    ...
 }

这就是你如何在代码中使用它来制作请求

  let logger = global.logger;
    const makeRequestHandler = (url, filepath) {
        ....
        logger.info('some message here')
        ....
    }

我觉得这些解决方案有问题:

//Solution 1 : As you pointed out yourself this can get messy when number of paramters increase and is not very readable or understandable.
let logger = require('./mylogger') 
let makeRequest = require('./makerequest') 
makeRequest.handler(url, filepath, logger)


//Solution 2 : Passing around the `this` context is never a good idea,for keeping sensitive data independent or scope isolation
let makeRequest = require('./makeRequest')(this)

注意: This article 详细解释了此解决方案的某些方面,供您参考。 还有一些提供这些功能的 npm 模块,例如 Service Locator .高温

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2020-05-16
    • 2011-04-21
    • 2013-10-30
    相关资源
    最近更新 更多