You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vue-shop-admin-work/modules/database.js

95 lines
6.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 引入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;
}