如何使用 express 保留数据库的一个实例



我正在使用express和sequelize来创建REST API。我只想保留数据库的一个实例,并在我可能创建的所有路由中使用它。我的第一个想法是在应用程序运行时立即创建实例。像这样的东西。

const express = require('express')
const databaseService = require( './services/database')
const config = require( './config')
const userRoute = require( './routes/user')
const app = express()
databaseService.connect(config.db_options).then(
connectionInstance => {
app.use('user', userRoute(connectionInstance))
app.listen(3000)
}
)

我没有见过这样的东西,所以我认为这不是一个好方法。

有什么想法吗?

我在多个生产应用程序中广泛使用并取得巨大成功的策略是在单个文件中定义数据库连接逻辑,如下所示:

数据库.js

const dbClient = require('some-db-client')
let db
module.exports.connectDB = async () => {
const client = await dbClient.connect(<DB_URL>)
db = client.db()
}
module.exports.getDB = () => {
return db
}

显然,连接逻辑需要比我上面定义的更复杂,但您可以想到,您将使用您选择的任何数据库客户端库连接到数据库,并保存对数据库单个实例的引用。然后,无论在需要与数据库交互的任何地方,都可以调用getDB函数。但首先,您需要从服务器应用程序入口文件调用connectDB函数。

服务器.js

async function run() {
const db = require('./database')
await db.connectDB()
const app = require('express')()
const routes = require('./routes')
app.use('/', routes)
app.listen(3000, () => {
console.log('App server listening to port 3000')
})
}

在初始化express之前,您将调用服务器应用程序入口文件中初始化数据库连接。之后,应用程序中需要访问数据库的任何位置都可以简单地调用getDB()函数,并根据需要从那里使用返回的数据库对象。这不需要过于复杂的连接打开和关闭逻辑,并且只需维护可在任何地方使用的单个数据库连接,从而节省在您想要访问数据库时不断打开和关闭连接的开销。

相关内容