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

Jul*_*eda 5 database instance node.js express tedious

我正在使用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)
    }
)
Run Code Online (Sandbox Code Playgroud)

我还没有见过这样的事情,所以我相信这不是一个好方法。

有任何想法吗 ?

n4t*_*t4r 7

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

数据库.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
}
Run Code Online (Sandbox Code Playgroud)

显然,连接逻辑需要比我上面定义的更复杂,但是您可以理解,您将使用您选择的任何数据库客户端库连接到数据库,并保存对数据库的单个实例的引用。然后,无论您需要与数据库进行交互,都可以调用该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')
  })
}
Run Code Online (Sandbox Code Playgroud)

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