如何在整个应用程序中访问一个文件的变量?
我有一个使用Express和Typescript的Node REST API。我创建了一个Database
类,该类能够连接,断开连接和执行查询。我的app.js(入口文件)为此创建了一个实例database
并启动快递服务器。根据要求,我有以下流程:
- 请求先调用中间件功能,最后再调用控制器
- 控制器调用其他一些类并传递数据
- 最近这些类调用查询文件以访问数据库
查询文件本身需要访问数据库类的实例。他们可以调用query函数并传递准备好的语句。我不确定如何将实例database
从我的app.ts(进入文件)一直传输到那些查询文件。
我发现了多种解决方案:
使用global variables
将实例添加到请求对象
将实例添加到response locals
将实例添加到app locals
将变量从一个文件传输到整个应用程序的最佳方法/做法是什么?
((当前我唯一要传递的变量是数据库实例...)
回答如下:使用service体系结构或服务架构方式:制作这样的目录结构:dependency注入。
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方法,因为它更具模块化和可读性。
我个人更喜欢该服务