mm_os
Version:
这是超级美眉服务端框架,用于快速构建应用程序。
160 lines (149 loc) • 3.11 kB
JavaScript
const Item = require('mm_machine').Item;
/**
* Api接口驱动类
* @extends {Item}
* @class
*/
class Drive extends Item {
/**
* 构造函数
* @param {String} dir 当前目录
* @constructor
*/
constructor(dir) {
/**
* 定义当前RPC文件路径
*/
this.rpc_file_now = "";
/**
* 定义rpc 方法
*/
this.methods = {};
}
}
/**
* 获取现有参数
* @param {String} file 文件名
* @return {Object} 获取的对象
*/
Drive.prototype.getParam = function(file) {
if ($.param) {
var obj = $.param.list.getObj({
filename: file
});
if (obj) {
return obj;
}
}
return null;
};
/**
* 设置参数对象
* @param {Object} param 参数对象
*/
Drive.prototype.setParam = function(param) {
if ($.param) {
var lt = $.param.list;
if (lt) {
var has = false;
var len = lt.length;
for (var i = 0; i < len; i++) {
var o = lt[i];
if (param.filename === o.filename) {
$.param.list[i] = param;
has = true;
break;
}
}
if (!has) {
$.param.list.push(param);
}
}
}
};
/**
* 加载参数
* @param {String} file_path 文件路径
*/
Drive.prototype.loadParam = async function(file_path) {
if (file_path) {
var p = file_path.fullname(this.dir);
var param = this.getParam(p);
if (param) {
this.param = param;
} else {
this.param = new Param(this.dir);
await this.param.exec('load_config', p);
this.setParam(this.param);
this.param.load('load');
}
}
};
/**
* 加载完成后执行
*/
Drive.prototype.load_after = function() {
var cg = this.config;
this.loadParam(cg.param_path);
};
/**
* 验证参数
* @param {Object} query url参数
* @param {Object} body 内容参数
* @param {String} method 方法
* @return {Object} 验证结果
*/
Drive.prototype.checkParam = function(query, body, method) {
if (this.param) {
var msg = this.param.check(query, body, method);
if (msg) {
var code;
if (msg.indexOf("必须") !== -1 || msg.indexOf("为空") !== -1) {
code = 30001;
} else {
code = 30002;
}
return $.ret.error(code, msg);
}
}
return null;
};
/**
* 运行GRPC方法
* @param {Object} db 数据库管理器
* @param {String} method 方法名称
* @param {Object} query 查询条件
* @param {Object} body 增改项
* @return {Object} 返回执行结果
*/
Drive.prototype.run = async function(db, method, query, body) {
var func = this.methods[method];
var ret = {};
try {
if (func) {
ret = this.checkParam(query, body, method);
if (!ret) {
ret = await func(db, query, body);
}
} else {
ret = {
error: {
code: 60000,
message: "方法名称不存在",
data: Object.keys(this.methods)
}
}
}
} catch (err) {
$.log.error("运行RPC方法错误!", method, err);
ret = {
error: {
code: 500,
message: "服务端业务逻辑错误"
}
}
}
return ret;
};
/* 导出驱动 */
module.exports = Drive;