最近在写一个接口配置管理的一个东西。
比如前端要一个用户登录接口,是post请求,之前写的话,就是规规矩矩的在后台写代码,
通过路由什么怎么的跳转到相应的方法那里,然后获取到传过来的参数,拿到参数后,再调用数据库查询,判断用户存在与否
最后返回结果给前端。
我现在写的这个东西,将以前的这些步骤全都以抽里出一条或几天规则,然后按照事先定义好的顺序,由上而下依次执行,最后返回结果给调用者。
以后我只配置规则,不用开发接口,少接口只要在管理页面里添加一条就OK了,想改参数什么的,也只在管理界面修改即可完成,这样也不用重启服务器。
之前在NodeJs在调用MySQL的时候,由于我写的那个DBHelper类里创建连接,以是Pool的时候创建的,代码如下
this.pool = mysql.createPool({
connectionLimit: 5,
host: 'localhost', // 数据库连接
user: 'liaohb', // 数据库名用户名
password: 'xiaotuni', // 密码
database: 'nodejs' // 表空间
});
由于每来一个请求都会createPool一个池,处理后我会调用 .end 方法来释放。
NodeJs是异步处理的,当前还没有处理完呢,后面的请求也接口着了,正在这个时候,前面调用了.end方法,后台还没有处理完的就开始报 pool close信息。
弄得我头都大了,今天突然想起来了用队列来管理请求,是不是就不会出现在这种情况了。
于是就写一个队列类,用来管理当前请求的,来一个就往队列里插入一个请求,由于队列的规则是先进先出的原理。
这样我瑞在创建createPool的时候,就不会出现在,前端调用 .end 时候,后面调用数据库请求的时候报 pool close的错误了。
我写的这个队列其实非常的简单,在这里标记一下。
/**
* 队列管理,主要是用来处理量请求时
* 由于要调用数据库,大量的请求,在调用的时候
* 前面调用 .end方法,后面就会出现在pool close的情况。
*
* 也许还有其它好的办法,目前就想到了这种方法。
*
* @class ManagerQueue
*/
class ManagerQueue {
/**
* 创建一个带参数的构造函数
* @param {any} MySqlHelper mysql操作类
* @memberof ManagerQueue
*/
constructor(MySqlHelper) {
this._Queue = [];
this.IsLock = false;
this.MySqlHelper = MySqlHelper;
}
/**
* 添加请求到队列里
*
* @param {any} options 参数
* @memberof ManagerQueue
*/
AddQueue(options) {
this._Queue.push(options);
this.GetQueueLength();
if (!this.IsLock) {
this.IsLock = true;
const args = this._Queue.shift();
setTimeout(() => {
this.NextQueue(args);
}, 0);
}
}
/**
* 下一个
*
* @returns
* @memberof ManagerQueue
*/
Next() {
const { _Queue } = this;
if (_Queue.length === 0) {
this.IsLock = false;
console.log('---------队列处理完了------');
return;
}
this.GetQueueLength();
setTimeout(() => {
this.NextQueue(_Queue.shift());
}, 0);
}
/**
* 执行下一请求
*
* @param {any} args
* @returns
* @memberof ManagerQueue
*/
NextQueue(args) {
// ....
}
/**
*
*
* @memberof ManagerQueue
*/
GetQueueLength() {
console.log('---------队列大小为:【%d】--------', this._Queue.length);
return this._Queue.length;
}
}
module.exports = ManagerQueue;