我正在使用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)
}
)
我还没有看到这样的东西,所以我认为这不是一个好方法。
有什么想法吗?
答案 0 :(得分:1)
我在多个生产应用程序中广泛使用并取得巨大成功的一种策略是在单个文件中定义数据库连接逻辑,如下所示:
database.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
函数。
server.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()
函数,并从那里根据需要使用返回的数据库对象。这样就不需要太复杂的连接打开和关闭逻辑,并且只要保持一个可在任何地方使用的数据库连接,就可以在每次访问数据库时节省不断打开和关闭连接的开销。