|
|
// 引入Node.js的mysql模块,用于与MySQL数据库进行交互(虽然此处只是引入,后续具体使用情况暂未明确体现)
|
|
|
require('mysql');
|
|
|
// 引入Node.js的文件系统模块fs,用于对文件进行读写等操作
|
|
|
var fs = require("fs");
|
|
|
// 引入orm模块,可能用于对象关系映射(Object Relational Mapping)相关操作,方便在Node.js中操作数据库
|
|
|
var orm = require("orm");
|
|
|
// 引入bluebird模块,用于提供更强大的Promise功能,便于处理异步操作
|
|
|
var Promise = require("bluebird");
|
|
|
// 引入path模块,用于处理文件路径相关的操作
|
|
|
var path = require("path");
|
|
|
|
|
|
/*
|
|
|
* initialize函数用于初始化数据库相关的配置以及加载ORM(对象关系映射)模型,
|
|
|
* 它接收应用程序环境对象、回调函数作为参数,通过一系列操作完成数据库连接和模型加载,
|
|
|
* 并在操作完成后通过回调函数返回相应结果。
|
|
|
*
|
|
|
* @param {Object} app - 应用程序环境对象,通常包含了应用的一些全局配置和上下文信息,可用于挂载数据库实例、模型等相关对象。
|
|
|
* @param {Function} callback - 回调函数,在数据库初始化及模型加载完成(成功或失败)后被调用,用于传递操作结果等信息。
|
|
|
*/
|
|
|
function initialize(app, callback) {
|
|
|
// 加载配置文件,通过config模块(这里应该是自定义的配置管理模块)获取名为"db_config"的配置信息
|
|
|
var config = require('config').get("db_config");
|
|
|
|
|
|
// 从配置信息中提取数据库相关的配置参数,构建一个包含协议、主机、数据库名称、端口、用户名、密码以及查询相关配置(启用连接池、开启调试模式)的对象opts
|
|
|
var opts = {
|
|
|
protocol: config.get("protocol"),
|
|
|
host: config.get("host"),
|
|
|
database: config.get("database"),
|
|
|
port: config.get("port"),
|
|
|
user: config.get("user"),
|
|
|
password: config.get("password"),
|
|
|
query: { pool: true, debug: true }
|
|
|
};
|
|
|
|
|
|
// 在控制台打印数据库连接参数,将opts对象转换为JSON字符串格式输出,方便查看配置情况
|
|
|
console.log("数据库连接参数 %s", JSON.stringify(opts));
|
|
|
|
|
|
// 使用orm模块的express方法初始化ORM模型,将数据库配置参数opts以及一个包含define函数的对象作为参数传入
|
|
|
app.use(orm.express(opts, {
|
|
|
define: function (db, models, next) {
|
|
|
// 将数据库实例db挂载到应用程序环境对象app上,方便在其他地方访问数据库实例
|
|
|
app.db = db;
|
|
|
// 同时也将数据库实例挂载到全局对象global上,命名为database,不过使用全局变量需要谨慎,避免命名冲突等问题
|
|
|
global.database = db;
|
|
|
|
|
|
// 获取映射文件的路径,通过拼接当前工作目录和"/models"来确定模型文件所在的文件夹路径
|
|
|
var modelsPath = path.join(process.cwd(), "/models");
|
|
|
|
|
|
// 使用文件系统模块的readdir方法读取指定路径下的所有文件(即模型文件),读取完成后会调用回调函数处理结果
|
|
|
fs.readdir(modelsPath, function (err, files) {
|
|
|
// 创建一个数组,用于存放所有加载模型的异步函数,每个元素对应一个模型文件的加载操作
|
|
|
var loadModelAsynFns = new Array();
|
|
|
// 以下循环遍历读取到的所有文件,准备加载每个模型文件对应的模型定义(通过db.loadAsync方法异步加载)
|
|
|
// console.log("开始加载 ORM 模型层文件 ");
|
|
|
for (var i = 0; i < files.length; i++) {
|
|
|
var modelPath = modelsPath + "/" + files[i];
|
|
|
// console.log("加载模型 %s", modelPath);
|
|
|
// 将每个模型文件的异步加载函数存入数组中,后续会统一处理这些异步加载操作
|
|
|
loadModelAsynFns[i] = db.loadAsync(modelPath);
|
|
|
}
|
|
|
|
|
|
// 使用Promise.all方法来并行处理所有模型文件的加载操作,当所有加载操作都成功完成后,执行then回调函数
|
|
|
Promise.all(loadModelAsynFns)
|
|
|
.then(function () {
|
|
|
// console.log("ORM 模型加载完成");
|
|
|
// 遍历数据库实例中已加载的所有模型,将每个模型挂载到models对象上,方便统一管理和访问
|
|
|
for (var modelName in db.models) {
|
|
|
models[modelName] = db.models[modelName];
|
|
|
}
|
|
|
// 将包含所有模型的models对象挂载到应用程序环境对象app上,方便在应用中使用模型进行数据库操作
|
|
|
app.models = models;
|
|
|
// 调用传入的回调函数,传递null表示操作成功完成,无错误信息
|
|
|
callback(null);
|
|
|
// 执行next函数,用于告知orm模块相关操作已完成,可继续后续流程(具体取决于orm模块的设计和使用方式)
|
|
|
next();
|
|
|
})
|
|
|
.catch(function (error) {
|
|
|
// 如果在加载模型过程中出现错误,在控制台打印错误信息,同时调用回调函数并传递错误对象,告知调用者操作失败
|
|
|
console.error('加载模块出错 error: ' + err);
|
|
|
callback(error);
|
|
|
// 同样执行next函数,告知orm模块相关流程结束(即便出现错误)
|
|
|
next();
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
// 将initialize函数作为模块的一个属性暴露出去,方便其他模块引入并调用该函数进行数据库初始化操作
|
|
|
module.exports.initialize = initialize;
|
|
|
|
|
|
// 定义一个函数用于获取全局的数据库实例对象,通过返回global对象上挂载的database属性(在initialize函数中进行挂载的)来实现
|
|
|
module.exports.getDatabase = function () {
|
|
|
return global.database;
|
|
|
} |