【问题标题】:How to make variables of one file accessible along the entire application?如何使一个文件的变量在整个应用程序中都可以访问?
【发布时间】:2019-12-22 19:09:10
【问题描述】:

我有一个使用 Express 和 JavaScript 的 Node REST API。我创建了一个Database 类,它能够连接、断开连接和执行查询。我的 app.js(入口文件)创建了一个实例 database 并启动了快速服务器。根据请求,我有以下流程:

  • 请求调用中间件函数,最后调用控制器
  • 控制器调用其他一些类并传入数据
  • 最后这些类调用查询文件来访问数据库

查询文件本身需要访问数据库类的实例。他们可以调用 query 函数并传入他们准备好的语句。我不确定如何将实例 database 从我的 app.js(入口文件)一直传输到这些查询文件。

我找到了多种解决方案:

将变量从一个文件传输到整个应用程序的最佳方式/实践是什么?

【问题讨论】:

  • 是的,抱歉,您的回答很好,但我认为依赖注入更合适。但我正在等待 indabz 的回复。但是为你的 +1 :)

标签: javascript node.js architecture system-design


【解决方案1】:

使用服务架构或依赖注入。

服务架构方式:

制作这样的目录结构:

root (directory)
|
|-->app.js
|-->controllers (directory)
|-->services (directory)
      |
      |-> DatabaseService.js
      |-> XYZService.js
      |-> index.js

现在在您的 index.js 文件中 require 服务类和 export 这些类的实例,如下所示:

var Database =  require('./DatabaseService')
var XYZ = require('./XYZService')

module.exports = {
    database: new Database(),
    xyz: new XYZ()
}

现在,require 这些服务可以放在代码中的任何位置,如下所示:

// SomeController.js
var database = require('../services').database

...
// DO WHATEVER YOU WANT WITH 'database' variable
...

依赖注入方式:

我假设您使用的是快速路线。通过将路由控制器包装在 lambda function 中来执行依赖注入,如下所示:

api.get('/user/:id', function (req, res) { // <-- wrapping 
   var database = new Database()
   return yourRouteController(req, res, database) // <-- Inject your database instance here
})

PS 我个人更喜欢 Service 方式,因为它更加模块化和可读性更强。

【讨论】:

    【解决方案2】:

    我见过的唯一其他解决方案是使用依赖注入。它仍在使用全局变量,但您可以在应用运行时随时调用您的数据库连接的特定实例,而不是将其从一个类扔到另一个类。

    【讨论】:

    • 感谢您的回复。你介意为此提供一个例子吗?我认为使用依赖注入应该是正确的答案
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2019-02-02
    相关资源
    最近更新 更多