首页 > 解决方案 > 如何让整个应用程序全局可用的 MySQL 连接

问题描述

我有一个 NodeJS 后端。我正在使用 mysql 插件(不是连接器 X API)连接到数据库。我想在应用程序启动时打开一个连接并使该连接可用于应用程序中的所有 API,而不是每个模块的单独连接。我怎样才能做到这一点?

数据库连接在一个单独的 javascript 文件中,代码如下:

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: process.env.HOST,
  user: process.env.USER,
  password: process.env.PASSWORD,
  database: process.env.DATABASE,
});

connection.connect((err) => {
  if (err) throw err;
  console.log('[SERVER] Database connection established..');
});

module.exports = connection;

我想要一些类似在index.js而不是单独的控制器模块中创建连接的东西。

编辑: 我在每个文件的第一行放置了一个 console.log。这是加载文件的顺序。

在此处输入图像描述

这是我的 index.js 文件(这是应用程序的入口点)

const express = require('express');
const bodyParser = require('body-parser');
require('dotenv').config();

const db = require('./src/utils/DatabaseConnection');
db.establishConnection();

app.listen(port, () => {
  console.log(`[SERVER] Up and running at http://localhost:${port}`);
});

这就是我在 RegisterController.js 文件中调用已建立连接的方式

const database = require('../../utils/DatabaseConnection');
const connection = database.getConnection();
/* Rest of the code*/

Q.1 如果我establishConnection()在服务器启动之前调用该方法,那么为什么[SERVER] Database connection established..在服务器运行在端口消息之后会记录消息?

Q.2 Node.js 应用程序的文件如何加载到内存中是否有特定的方法?

标签: javascriptmysqlnode.js

解决方案


为数据库连接创建一个单独的文件会更具可读性。
既然你想要它在 index.js 本身,你可以像这样拥有它

app.use('/users/list', usersList(connection))

通过这种方式,您将连接作为函数中的参数usersList。所以,usersList将是

exports.usersList = (connection) => {
  // your database operation
}

您还可以为该函数传递其他参数。

我仍然建议您为数据库配置和连接使用单独的文件。那个单独的文件看起来像这样

const mysql = require('mysql');
var _connection;

exports.createConnection = (_connection) => {
  const connection = mysql.createConnection({
    host: process.env.HOST,
    user: process.env.USER,
    password: process.env.PASSWORD,
    database: process.env.DATABASE,
  });
  _connection = connection;

  connection.connect((err) => {
    if (err) throw err;
    console.log('[SERVER] Database connection established..');
  });
}};

exports.getConnection = () => {
  return _connection;
}

编辑:关于稍后打印的日志,这是因为启动服务器不需要连接或其他系统进程,但是,建立连接是异步的,所以当它完成时,你的服务器已经启动了。


推荐阅读