基于nodejs的流水线式的CRUD服务。依赖注入可以支持插件。
写代码好多年了,发现大家的思路都是写代码、写代码、写代码,还弄了个称号——码农。
我是挺无语的,我的思路是——不写代码、不写代码、不写代码!
无聊的代码为啥要重复写呢?甚至一写写好几年。
举个例子吧,要不然大家肯定很懵。
当我们刚开始学习数据库编程的时候,我们会先写一段代码,实现往一个表里添加数据的功能。这段代码是必须写的,不写怎么会?
然后熟悉这段代码,尽量知道其含义,越深入越好。
然后呢,进入项目组,发现项目里面有n张数据表,每个表都至少要有一个添加数据的功能。
那么怎么办?当然要写代码了。于是添加数据的代码被一遍又一遍的写,区别在于表名和字段名的不同,因为每个表都有自己的名称和自己的字段。
仅仅是因为表名和字段名的不同,就要一遍一遍的写类似的代码吗?这就是我说的无聊的代码。
虽然各位前辈想了很多很多的方法,比如代码生成器,这样类似的代码就不用写了,直接生成就好。但是当字段名变了怎么办?增加了一个字段怎么办?
比如orm,比如各种框架,但是总是要写代码。没发现谁把不写代码作为目标。
我在这些年里也在不断尝试,虽然有了一些效果,但是缺点还是很多,离不写代码还很远,只是做到了不写重复代码的目的。
我一直用c#来实现我的想法,但是c#太严谨了,好多思路实现起来太复杂。比如:
1、 必须先定义实体类,然后才能各种传递
2、 “插件”实现起来非常不方便。
3、 必须先编译,然后才能加载。
4、 对json不太友好,需要反复转换。
5、 反射、泛型这类的不太理想。
看了一下其他语言,发现node非常适合我的想法,也能避免上面的那些“缺点”,只是由于种种原因,现在才开始正式学习。
node使用的是javascript,天生对json非常友好,可以直接操作,不用各种转换。
可以用require加载javascript代码并且立即编译,可以利用这个特性方便的写插件。
require也可以加载json文件,这样依赖注入就很容易实现了。
性能方面也不用担心,毕竟阿里爸爸都在用。
好吧,介绍一下思路,上流程图
这是初步想法,具体细节还在不断完善。
下面是第一版代码,很初级,只是实现基本功能,因为这是我第一次写node,边熟悉node的写法和基本功能,边实现我的想法。
话说,语言里面没有node呢,只好选择javascript了。
/**
* created by jyk00 on 2019/3/31.
* 添加数据的服务
*/
exports.start = function(code) {
console.log('开始添加数据');
/** 根据配置信息实现添加数据的功能
* 获取服务信息
* 接收数据
* 验证数据
* 调用插件
* 持久化
* 获取持久化后数据
* 写数据变化日志
* 返回结果
*/
//获取服务信息
console.log('服务id:' + code);
var meta = require('./serviceadd_'+ code +'.json');
console.log('获取服务信息:' + meta);
//获取实体类,先模拟一下
var data = require('./node_user.json');
//验证数据,暂时略
//调用持久化前的插件
//持久化
savedata(function(err, result) {
console.log('#######################');
console.log('savedata的回调');
console.log('result:', result);
});
//调用持久化之后的插件
//记录数据变化日志
//持久化数据
function savedata(callback) {
console.log('开始持久化');
//创建mysql对象
var mysql = require('mysql');
var cnstring = require('../sqlconnection.json');
var connection = mysql.createconnection(cnstring);
var sql = meta.sqlcache;
//拼接数据
var valuesparams = createparams();
connection.connect();
connection.query(sql,valuesparams,function (err, result) {
if(err){
console.log('[insert error ] - ',err.message);
callback(err, result);
return;
}
console.log('-------insert by service ----------');
console.log('insert id:',result.insertid);
console.log('#######################');
callback(err, result);
});
connection.end();
console.log('调用结束等待结果');
}
//拼接valuesparams
function createparams(){
console.log('开始拼接数据数组');
var params = [];
//数据变成数组的形式
var colname = "";
for (var i=0 ;i<meta.column.length;i++) {
colname = meta.column[i];
params.push(data[colname]);
}
return params;
}
};
下面是第二版代码,功能多了一些,代码也更难看了,都是异步害的。这么丑陋的代码,肯定要进行改善的。
/**
* created by jyk00 on 2019/3/31.
* 添加数据的服务
*/
exports.start = function(code) {
console.log('开始添加数据');
/** 根据配置信息实现添加数据的功能
* 获取服务信息
* 接收数据
* 验证数据
* 调用插件
* 持久化
* 获取持久化后数据
* 写数据变化日志
* 返回结果
*/
//获取服务信息
console.log('服务id:' + code);
var meta = require('./serviceadd_'+ code +'.json');
console.log('获取服务信息:' + meta);
//获取实体类,先模拟一下
var data = require('./node_user.json');
//验证数据,暂时略
//调用持久化前的插件
var plugname = meta.pluginbefore;
if (plugname.length === 0){
//没有插件,不调用
console.log('没有插件,不调用');
//持久化及后续
saveandlast(data);
}
else
{
//有插件
console.log('有插件,调用');
var plug = require('../plugin/' + plugname);
plug.begin(data,function(data){
//持久化及后续
saveandlast(data);
});
}
//持久化以及之后的事情
function saveandlast(data) {
//持久化
savedata(data,function(err, result){
console.log('#######################');
console.log('savedata的回调:' + data.age);
console.log('result:',result);
//调用持久化之后的插件
plugname = meta.pluginafter;
if (plugname.length === 0){
//没有插件,不调用
//记录数据变化日志
}
else{
//有插件
plug = require('../plugin/' + plugname);
plug.begin(err, result,data,function() {
//记录数据变化日志
});
}
});
}
//持久化数据
function savedata(data,callback) {
console.log('开始持久化');
console.log('savedata的age:' + data.age);
//创建mysql对象
var mysql = require('mysql');
var cnstring = require('../sqlconnection.json');
var connection = mysql.createconnection(cnstring);
var sql = meta.sqlcache;
console.log('sql:' + sql);
//拼接数据
var valuesparams = createparams(data);
connection.connect();
connection.query(sql,valuesparams,function (err, result) {
if(err){
console.log('[insert error ] - ',err.message);
callback(err, result);
return;
}
console.log('-------insert by service ----------');
console.log('insert id:',result.insertid);
console.log('#######################');
callback(err, result);
});
connection.end();
console.log('调用结束等待结果');
}
//拼接valuesparams
function createparams(data){
console.log('开始拼接数据数组');
console.log('createparams的age:' + data.name);
var valuesparams = [];
//数据变成数组的形式
var colname = "";
for (var i=0 ;i<meta.column.length;i++) {
colname = meta.column[i];
valuesparams.push(data[colname]);
}
return valuesparams;
}
};
今天先到这里,代码在不断改进中。以上代码都是可以正常运行的。
第二版的代码,有很多缺点,比如层次不分明,思路混乱,没法扩展。因为这还只是单表的添加,那么主从表的添加呢,批量添加又怎么办?还是要不断的改进的。