node.js - 如何使用 express 保留数据库的一个实例

标签 node.js database express instance 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)
    }
)

我还没有看到类似的东西,所以我认为这不是一个好方法。

有什么想法吗?

最佳答案

我在多个生产应用程序中广泛使用并取得巨大成功的策略是在类似于以下内容的单个文件中定义数据库连接逻辑:

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() 函数,并根据需要从那里使用返回的数据库对象。这不需要过于复杂的连接打开和关闭逻辑,并且只需维护一个可在任何地方使用的单个数据库连接,从而节省了在您想要访问数据库时不断打开和关闭连接的开销。

关于node.js - 如何使用 express 保留数据库的一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712028/

相关文章:

node.js - 蒙戈访问量最大

node.js - 如何将 Typescript 定义添加到 Express req 和 res

javascript - 这个模式是如何工作的 : 'test/e2e/**/*.spec.js' ?

node.js - 我可以向 NPM 添加调试脚本吗?

node.js - 在 lambda 函数中发送 JSON 响应时无服务器离线响应问题

java - Sqlite向数据库插入多条记录

java - 数据库设计 - 使用 Short 而不是 Varchar - 用于状态字段

node.js - 如何 POST/GET 到路由的根目录?

javascript - POST 方法未发送所有数据

node.js - 将我的库分为库、核心和插件