javascript - 如何让整个应用程序全局可用的 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 应用程序的文件如何加载到内存中是否有特定的方法?
解决方案
为数据库连接创建一个单独的文件会更具可读性。
既然你想要它在 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;
}
编辑:关于稍后打印的日志,这是因为启动服务器不需要连接或其他系统进程,但是,建立连接是异步的,所以当它完成时,你的服务器已经启动了。
推荐阅读
- r - 用于按列计算 R 数据帧中位数的函数,该 R 数据帧定期对多个数据帧执行
- mongodb - 如何聚合猫鼬深度收藏?(过滤数据)
- spring-boot - 在 Spring Boot 中调度一个函数
- postgresql - Postgres 中的异常处理。在异常处理程序中使用引发和回滚
- spring - Spring Boot/Thymeleaf 可执行 Jar,错误解析模板
- python - 如何在没有内置函数的情况下使用参数'key'?
- reactjs - React:为什么注册表单没有在 firebase 用户中创建新用户?
- ios - UISearchBar 警告:UITextEffectsWindow 不应成为键。请向键盘提交错误 | 带有此调用堆栈的 iOS
- html - 如何使用 css 创建倾斜的图像和文本?
- java - 如何使用execute_script输入python selenium