Nodejs 分模块写的时候,不想总是require Mysql,怎么处理?

Nodejs 分模块写的时候,不想总是require Mysql,怎么处理?

分模块写的时候,不想总是require Mysql,怎么处理?

4 回复

在 Node.js 中,当我们希望将模块分离时,通常会使用 require 来引入其他模块。如果你希望在多个模块中避免频繁地 require('mysql'),可以通过创建一个独立的数据库服务模块来实现这一点。这样,你只需要在启动应用时初始化一次数据库连接,并在整个应用程序中共享这个连接。

示例代码

首先,我们创建一个名为 db.js 的文件,用于封装数据库连接逻辑:

// db.js
const mysql = require('mysql');

let connection;

function createConnection() {
    connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'password',
        database: 'my_database'
    });

    connection.connect((err) => {
        if (err) throw err;
        console.log('Connected to MySQL database!');
    });
}

createConnection();

module.exports = {
    getConnection: () => connection,
    query: (sql, params) => new Promise((resolve, reject) => {
        connection.query(sql, params, (error, results, fields) => {
            if (error) return reject(error);
            resolve(results);
        });
    })
};

在这个 db.js 文件中,我们创建了一个 MySQL 连接,并将其导出为一个对象。该对象包含两个方法:getConnection()query(sql, params)getConnection() 返回当前的数据库连接,而 query() 是一个封装了查询操作的方法。

接下来,在需要使用数据库的地方(例如在一个服务模块中),你可以这样使用:

// userService.js
const { getConnection, query } = require('./db');

async function getUserById(userId) {
    const connection = getConnection();
    try {
        const [rows] = await query('SELECT * FROM users WHERE id = ?', [userId]);
        return rows[0];
    } catch (error) {
        throw error;
    }
}

通过这种方式,你可以在不同的模块之间共享数据库连接,避免每次都重新 require('mysql'),从而使代码更加简洁和高效。


定义到global里怎么样?

在 Node.js 中,如果你希望在分模块写代码时减少 require('mysql') 的重复调用,可以采用几种方法来优化代码结构。一种常见的方法是创建一个配置文件或初始化文件,专门用于初始化数据库连接,并导出该连接对象。这样,其他模块只需要引用这个初始化文件即可使用已经建立好的数据库连接。

示例代码

  1. 创建数据库初始化文件(例如 dbConfig.js):
const mysql = require('mysql');

// 创建数据库连接池
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'your_database'
});

module.exports = pool;
  1. 在需要使用数据库的模块中引用
const db = require('./dbConfig.js');

// 使用数据库连接
db.query('SELECT * FROM your_table', (err, results) => {
    if (err) throw err;
    console.log(results);
});

这种方法可以显著减少代码中的冗余部分,并提高模块间的可维护性和复用性。另外,如果需要在多个地方共用同一个数据库连接,这种方法特别有效。

进阶技巧

  • 如果你的项目较大,可以考虑使用像 Sequelize 或 Knex.js 这样的 ORM(对象关系映射工具),它们不仅提供更高层次的抽象,还能更方便地处理数据库操作。
  • 使用环境变量存储数据库连接信息,可以增加代码的安全性和灵活性。

通过这种方式,你可以将数据库连接逻辑集中管理,从而使得每个模块都可以轻松访问数据库而无需每次都重新创建连接。

回到顶部