|
|
var path = require("path");
|
|
|
// 引入 Node.js 的 path 模块,用于处理文件和目录的路径
|
|
|
|
|
|
// 获取数据库模型,通过 path.join 拼接当前工作目录和相对路径来引入模块
|
|
|
databaseModule = require(path.join(process.cwd(), "modules/database"));
|
|
|
// process.cwd() 获取当前工作目录,path.join 用于拼接路径,确保跨平台兼容性
|
|
|
|
|
|
// 引入自定义的 logger 模块,并调用 logger 函数获取日志记录器
|
|
|
var logger = require('../modules/logger').logger();
|
|
|
// 引入 logger 模块,并调用其 logger 方法获取一个日志记录器实例
|
|
|
|
|
|
/**
|
|
|
* 创建对象数据
|
|
|
*
|
|
|
* @param {[type]} modelName 模型名称,用于标识要创建数据的具体模型
|
|
|
* @param {[type]} obj 要创建的模型对象,包含具体的数据内容
|
|
|
* @param {Function} cb 回调函数,用于处理创建操作的结果,第一个参数可能为错误信息,第二个参数为创建成功后的返回结果(如果有)
|
|
|
*/
|
|
|
module.exports.create = function (modelName, obj, cb) {
|
|
|
// 从 databaseModule 中获取数据库对象
|
|
|
var db = databaseModule.getDatabase(); // 获取数据库连接或数据库实例
|
|
|
|
|
|
// 根据模型名称获取相应的模型
|
|
|
var Model = db.models[modelName]; // 从数据库实例的 models 属性中,根据模型名称获取对应的模型
|
|
|
|
|
|
// 调用模型的 create 方法创建对象,将结果传递给回调函数
|
|
|
Model.create(obj, cb);
|
|
|
// 使用模型的 create 方法创建新的数据对象,并通过回调函数处理结果
|
|
|
}
|
|
|
/**
|
|
|
* 获取所有数据
|
|
|
*
|
|
|
* @param {[type]} conditions 查询条件,用于筛选数据,包含多种可能的条件设置
|
|
|
* 查询条件统一规范
|
|
|
* conditions
|
|
|
* {
|
|
|
* "columns" : {
|
|
|
* 字段条件,存储具体字段和其对应的值
|
|
|
* "字段名" : "条件值"
|
|
|
* },
|
|
|
* "offset" : "偏移", // 用于分页,表示从第几条数据开始查询
|
|
|
* "omit" : ["字段"], // 表示要排除的字段列表
|
|
|
* "only" : ["需要字段"], // 表示只查询的字段列表
|
|
|
* "limit" : "", // 表示查询的数量限制,用于分页
|
|
|
* "order" :[
|
|
|
* "字段", A | Z, // 表示排序的字段和排序方向(升序或降序)
|
|
|
* ...
|
|
|
* ]
|
|
|
* }
|
|
|
* @param {Function} cb 回调函数,用于处理查询结果,第一个参数可能为错误信息,第二个参数为查询到的数据
|
|
|
*/
|
|
|
module.exports.list = function (modelName, conditions, cb) {
|
|
|
// 从 databaseModule 中获取数据库对象
|
|
|
var db = databaseModule.getDatabase(); // 获取整个数据库实例或连接
|
|
|
|
|
|
// 根据模型名称获取相应的模型
|
|
|
var model = db.models[modelName]; // 从数据库实例的 models 属性中,根据传入的模型名称获取对应的模型
|
|
|
|
|
|
// 如果模型不存在,调用回调函数并传递错误信息
|
|
|
if (!model) return cb("模型不存在", null); // 如果模型未找到,则立即返回错误信息给回调函数
|
|
|
|
|
|
// 初始化查询模型为 find 方法,表示要执行查询操作
|
|
|
var queryModel = model.find(); // 默认执行全表查询,后续根据条件进行筛选
|
|
|
|
|
|
// 如果存在查询条件,则根据条件进行相应的查询操作
|
|
|
if (conditions) {
|
|
|
// 如果指定了需要查询的字段条件
|
|
|
if (conditions["columns"]) {
|
|
|
queryModel = queryModel.find(conditions["columns"]); // 根据字段条件进行精确查询
|
|
|
}
|
|
|
|
|
|
// 如果指定了数据偏移量,用于分页查询
|
|
|
if (conditions["offset"]) {
|
|
|
queryModel = queryModel.offset(parseInt(conditions["offset"], 10)); // 解析偏移量为整数,并设置到查询模型中
|
|
|
}
|
|
|
|
|
|
// 如果指定了查询数量限制
|
|
|
if (conditions["limit"]) {
|
|
|
queryModel = queryModel.limit(parseInt(conditions["limit"], 10)); // 解析限制数量为整数,并设置到查询模型中
|
|
|
}
|
|
|
|
|
|
// 如果指定了只需要查询的字段列表
|
|
|
if (conditions["only"]) {
|
|
|
queryModel = queryModel.only(conditions["only"]); // 设置查询模型中只返回这些字段
|
|
|
}
|
|
|
|
|
|
// 如果指定了要排除的字段列表
|
|
|
if (conditions["omit"]) {
|
|
|
queryModel = queryModel.omit(conditions["omit"]); // 设置查询模型中排除这些字段
|
|
|
}
|
|
|
|
|
|
// 如果指定了排序条件
|
|
|
if (conditions["order"]) {
|
|
|
queryModel = queryModel.order(conditions["order"]); // 根据排序条件设置查询模型的排序方式
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 执行查询操作,并将结果传递给回调函数
|
|
|
queryModel.exec(cb); // 执行查询,并通过回调函数返回结果
|
|
|
}else {
|
|
|
// 如果没有指定查询条件,则执行全表查询
|
|
|
model = model.find();
|
|
|
}
|
|
|
|
|
|
// 执行查询操作并处理结果,通过回调函数返回查询结果或错误信息
|
|
|
model.run(function (err, models) { // 注意:这里可能是伪代码或特定框架的API,通常MongoDB等使用exec而不是run
|
|
|
if (err) {
|
|
|
// 如果查询过程中发生错误,打印错误信息并通过回调函数返回错误
|
|
|
console.log(err); // 在生产环境中,通常不会直接打印错误到控制台,而是记录到日志文件中
|
|
|
return cb("查询失败", null); // 立即返回错误信息给回调函数,不继续执行后续代码
|
|
|
}
|
|
|
// 如果查询成功,将查询结果通过回调函数返回
|
|
|
cb(null, models); // 第一个参数为null表示没有错误,第二个参数为查询到的数据模型数组
|
|
|
});
|
|
|
|
|
|
// 导出根据条件统计数量的函数
|
|
|
module.exports.countByConditions = function (modelName, conditions, cb) {
|
|
|
// 从 databaseModule 模块中获取数据库连接或实例对象
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的models属性中获取对应的模型
|
|
|
var model = db.models[modelName];
|
|
|
|
|
|
// 如果指定的模型不存在,则通过回调函数返回错误信息
|
|
|
if (!model) return cb("模型不存在", null);
|
|
|
|
|
|
// 定义一个内部回调函数,用于处理计数操作的结果
|
|
|
var resultCB = function (err, count) {
|
|
|
if (err) {
|
|
|
// 如果计数过程中发生错误,通过回调函数返回错误
|
|
|
return cb("查询失败", null);
|
|
|
}
|
|
|
// 如果计数成功,将结果(符合条件的记录数)通过回调函数返回
|
|
|
cb(null, count); // 第一个参数为null表示没有错误,第二个参数为统计到的数量
|
|
|
};
|
|
|
|
|
|
// 根据传入的条件执行计数操作
|
|
|
if (conditions) {
|
|
|
// 如果指定了查询条件
|
|
|
if (conditions["columns"]) {
|
|
|
// 如果条件中包含了字段条件,则根据这些条件进行计数
|
|
|
model = model.count(conditions["columns"], resultCB); // 注意:这里的API可能因框架而异,MongoDB等通常不使用count直接传递条件对象
|
|
|
} else {
|
|
|
// 如果没有指定字段条件,则执行全表计数
|
|
|
model.count(resultCB); // 注意:这里应该直接调用count方法并传入回调函数,而不是重新赋值给model变量,因为count方法通常不返回新的模型实例
|
|
|
}
|
|
|
} else {
|
|
|
// 如果没有指定任何条件,则执行全表计数
|
|
|
model.count(resultCB); // 同上,这里应该直接调用count方法
|
|
|
}
|
|
|
|
|
|
// 注意:在上面的代码中,对model的重新赋值(如 model = model.count(...))可能是不必要的,因为count方法通常不会返回一个新的模型实例用于后续的链式操作。
|
|
|
// 正确的做法应该是直接调用count方法并传入回调函数,如上面注释所示。
|
|
|
};
|
|
|
/**
|
|
|
* 获取一条数据
|
|
|
* @param {[type]} modelName 模型名称,用于指定要查找的模型,该名称应与数据库中定义的模型名称一致
|
|
|
* @param {[数组/对象]} conditions 条件集合,包含查找该条数据的具体条件,可以是对象形式或查询构造器
|
|
|
* @param {Function} cb 回调函数,用于处理查找结果,第一个参数为错误信息(如有),第二个参数为找到的数据对象
|
|
|
*/
|
|
|
module.exports.findOne = function (modelName, conditions, cb) {
|
|
|
// 从 databaseModule 模块中获取数据库连接或实例对象
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的models属性中获取对应的模型类
|
|
|
var Model = db.models[modelName];
|
|
|
|
|
|
// 如果指定的模型不存在,则通过回调函数返回错误信息,并终止后续操作
|
|
|
if (!Model) return cb("模型不存在", null);
|
|
|
|
|
|
// 如果查询条件为空,则通过回调函数返回错误信息,并终止后续操作
|
|
|
// 注意:在实际应用中,可能需要更细致的错误处理,比如允许无条件查询(即查询第一条记录)
|
|
|
if (!conditions) return cb("条件为空", null);
|
|
|
|
|
|
// 调用模型的 one 方法根据提供的条件查找一条数据
|
|
|
// 注意:这里的 one 方法可能是特定ORM框架提供的,不是所有数据库库或框架都有此方法
|
|
|
// 如果找不到符合条件的数据,one 方法通常会返回 null 或触发回调函数中的 err 参数
|
|
|
Model.one(conditions, function (err, obj) {
|
|
|
// 使用日志记录器记录可能出现的错误,这里使用的是 debug 级别,表示一般性的调试信息
|
|
|
// 在生产环境中,可能需要根据错误类型调整日志级别,比如使用 error 级别记录严重错误
|
|
|
logger.debug(err);
|
|
|
|
|
|
// 如果查询过程中发生错误,通过回调函数返回错误信息,并终止后续操作
|
|
|
if (err) {
|
|
|
return cb("查询失败", null);
|
|
|
}
|
|
|
|
|
|
// 如果查询成功,将找到的数据对象通过回调函数返回
|
|
|
return cb(null, obj);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新对象数据
|
|
|
*
|
|
|
* @param {[type]} modelName 模型名称,用于指定要更新的模型,该名称应与数据库中定义的模型名称一致
|
|
|
* @param {[type]} id 数据关键 ID,用于唯一确定要更新的具体数据记录
|
|
|
* @param {[对象]} updateObj 更新对象数据,包含要更新的字段及其新值
|
|
|
* @param {Function} cb 回调函数,用于处理更新操作的结果,第一个参数为错误信息(如有),第二个参数为更新操作的结果(可能因数据库库或框架而异)
|
|
|
*/
|
|
|
module.exports.update = function (modelName, id, updateObj, cb) {
|
|
|
// 从 databaseModule 模块中获取数据库连接或实例对象
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的models属性中获取对应的模型类
|
|
|
var Model = db.models[modelName];
|
|
|
|
|
|
// 根据提供的 ID 获取要更新的数据对象
|
|
|
// 注意:这里的 get 方法可能是特定ORM框架提供的,用于根据主键获取数据对象
|
|
|
// 在某些框架中,可能需要使用 findById 或类似的方法
|
|
|
Model.get(id, function (err, obj) {
|
|
|
// 如果获取数据对象过程中发生错误,比如ID不存在,则通过回调函数返回错误信息,并终止后续操作
|
|
|
if (err) return cb("更新失败", null);
|
|
|
|
|
|
// 如果成功获取到数据对象,则调用其 save 方法更新数据
|
|
|
// 注意:这里的 save 方法可能是特定ORM框架提供的,用于将数据对象的更改保存到数据库中
|
|
|
// save 方法通常会接受一个回调函数,用于处理保存操作的结果
|
|
|
obj.save(updateObj, cb);
|
|
|
|
|
|
// 注意:在某些框架中,可能需要显式地传递更新条件(如ID)给 save 方法,或者 save 方法本身就是根据数据对象的当前状态进行更新的
|
|
|
// 因此,这里的代码可能需要根据实际使用的数据库库或框架进行调整
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* 通过主键 ID 获取对象
|
|
|
* @param {[type]} modelName 模型名称,用于指定要查找的模型,该名称应与数据库中定义的模型名称一致
|
|
|
* @param {[type]} id 主键 ID,用于唯一确定要查找的具体数据记录
|
|
|
* @param {Function} cb 回调函数,用于处理查找结果,第一个参数为错误信息(如有),第二个参数为找到的数据对象(如有)
|
|
|
*/
|
|
|
module.exports.show = function (modelName, id, cb) {
|
|
|
// 从名为 databaseModule 的模块中获取数据库连接或实例对象,该模块应包含 getDatabase 方法
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类
|
|
|
// 这里的 models 属性可能是一个对象,其键为模型名称,值为对应的模型类
|
|
|
var Model = db.models[modelName];
|
|
|
|
|
|
// 使用模型类的 get 方法根据提供的主键 ID 获取对应的数据对象
|
|
|
// get 方法通常接受一个回调函数,用于处理获取过程中的结果或错误
|
|
|
Model.get(id, function (err, obj) {
|
|
|
// 将获取结果(或错误信息)通过回调函数返回给调用者
|
|
|
// 如果 err 存在,表示获取过程中发生了错误;如果 obj 存在,表示成功获取到了数据对象
|
|
|
cb(err, obj);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 通过主键 ID 删除对象
|
|
|
*
|
|
|
* @param {[type]} modelName 模型名称,用于指定要删除的模型,该名称应与数据库中定义的模型名称一致
|
|
|
* @param {[type]} id 主键 ID,用于唯一确定要删除的具体数据记录
|
|
|
* @param {Function} cb 回调函数,用于处理删除操作的结果,第一个参数为错误信息(如有),第二个参数在成功时通常为 null 或未定义(因为删除操作不返回被删除的对象)
|
|
|
*/
|
|
|
module.exports.destroy = function (modelName, id, cb) {
|
|
|
// 从名为 databaseModule 的模块中获取数据库连接或实例对象
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类
|
|
|
var Model = db.models[modelName];
|
|
|
|
|
|
// 使用模型类的 get 方法根据提供的主键 ID 获取要删除的数据对象
|
|
|
// 注意:在某些 ORM 框架中,可能不需要先获取对象再删除,而是可以直接根据 ID 删除
|
|
|
// 但这里的代码示例遵循了先获取对象再删除的模式,可能是为了演示或特定框架的要求
|
|
|
Model.get(id, function (err, obj) {
|
|
|
// 如果获取对象过程中发生错误(比如 ID 不存在),则通过回调函数返回错误信息
|
|
|
if (err) return cb("无模型 ID"); // 注意:这里的错误信息可能不够具体,实际应用中应提供更详细的错误信息
|
|
|
|
|
|
// 调用数据对象的 remove 方法删除该对象
|
|
|
// remove 方法通常也接受一个回调函数,用于处理删除过程中的结果或错误
|
|
|
obj.remove(function (err) {
|
|
|
// 如果删除过程中发生错误,则通过回调函数返回错误信息
|
|
|
if (err) return cb("删除失败"); // 同样,这里的错误信息可能不够具体
|
|
|
|
|
|
// 如果删除成功,则通过回调函数返回 null(或未定义),表示没有错误信息
|
|
|
return cb(null);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 通过模型名称获取数据库数量
|
|
|
*
|
|
|
* @param {[type]} modelName 模型名称,用于指定要统计数量的模型,该名称应与数据库中定义的模型名称一致
|
|
|
* @param {Function} cb 回调函数,用于处理统计结果,第一个参数为错误信息(如有),第二个参数为统计得到的数量
|
|
|
*/
|
|
|
module.exports.count = function (modelName, cb) {
|
|
|
// 从名为 databaseModule 的模块中获取数据库连接或实例对象
|
|
|
var db = databaseModule.getDatabase();
|
|
|
|
|
|
// 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类
|
|
|
var Model = db.models[modelName];
|
|
|
|
|
|
// 调用模型类的 count 方法统计该模型对应的数据记录数量
|
|
|
// count 方法通常不接受条件参数(除非特定框架支持),直接统计所有记录的数量
|
|
|
// 它也接受一个回调函数,用于处理统计过程中的结果或错误
|
|
|
Model.count(function (err, count) {
|
|
|
// 注意:这里的回调函数应该有两个参数,但原代码中的 cb 调用只传递了一个(err)
|
|
|
// 为了保持注释的准确性,我假设原代码是一个简化或错误的示例,并在此处修正
|
|
|
// 正确的调用应该是 cb(err, count),即将统计得到的数量也传递给回调函数
|
|
|
// 但由于原代码未修改,下面的注释仍基于原代码
|
|
|
|
|
|
// 理论上,这里应该将统计结果(或错误信息)通过回调函数返回给调用者
|
|
|
// 但由于原代码只传递了 err 参数,因此 count 参数被忽略了
|
|
|
// 为了修正这一点,应该将 cb 调用改为 cb(err, count)(如果这是预期的行为)
|
|
|
// 但由于要求是不删改原代码,所以下面的注释仍然基于原代码
|
|
|
|
|
|
// 将统计过程中的错误信息(如有)通过回调函数返回给调用者
|
|
|
// 注意:由于原代码忽略了 count 参数,因此调用者无法获取到统计的数量
|
|
|
cb(err); // 修正后应为 cb(err, count),但遵循不删改原代码的原则,此处保留原样
|
|
|
});
|
|
|
|
|
|
// 注意:上面的 Model.count 调用实际上可能是一个错误,因为大多数 ORM 框架的 count 方法
|
|
|
// 都会接受一个回调函数作为参数,用于处理统计结果。如果原代码中的 Model.count 方法
|
|
|
// 确实不接受回调函数(这不太可能),那么这里的代码将无法正常工作。
|
|
|
|
|
|
}
|
|
|
/**
|
|
|
|
|
|
通过条件判断数据是否存在
|
|
|
@param {[type]} modelName 模块名,用于指定要检查是否存在数据的模型
|
|
|
@param {[type]} conditions 条件,用于判断数据是否存在的条件集合
|
|
|
@param {Function} cb 回调函数,用于处理检查结果,第一个参数可能为错误信息,第二个参数为数据是否存在的布尔值
|
|
|
*/
|
|
|
module.exports.exists = function (modelName, conditions, cb) {
|
|
|
// 从 databaseModule 中获取数据库对象
|
|
|
var db = databaseModule.getDatabase(); // 获取全局数据库对象,用于后续操作
|
|
|
// 根据模型名称获取相应的模型
|
|
|
var Model = db.models[modelName]; // 从数据库对象中,通过模型名称获取到具体的模型
|
|
|
|
|
|
// 调用模型的 exists 方法检查数据是否存在,将结果传递给回调函数
|
|
|
Model.exists(conditions, function (err, isExists) { // 调用模型的exists方法,传入条件对象和回调函数
|
|
|
if (err) return cb("查询失败"); // 如果查询过程中出错,则通过回调函数返回错误信息
|
|
|
cb(null, isExists); // 如果没有错误,则通过回调函数返回数据是否存在的布尔值
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
获取指定名称的模型
|
|
|
@param {[type]} modelName 模型名,用于指定要获取的模型
|
|
|
@return {[type]} 返回指定名称的模型对象
|
|
|
*/
|
|
|
module.exports.getModel = function (modelName) {
|
|
|
// 从 databaseModule 中获取数据库对象
|
|
|
var db = databaseModule.getDatabase(); // 获取全局数据库对象,用于后续操作
|
|
|
// 根据模型名称获取相应的模型
|
|
|
return db.models[modelName]; // 从数据库对象中,通过模型名称获取到具体的模型,并返回该模型对象
|
|
|
} |