NodeJs 开发小记
有点明白为啥说有种思维方式是写作吧,就是明明想好好写突然不到如何写起,作为一个搞技术的,还是不废话,直接上内容吧
最近的区域链挺流行,带火了一波玩客猴系列的游戏,这下公司正好接了一个项目就是做一个类似的这个游戏。 一个月的开发时间,前端采用h5实现,后端考虑到发送消息的缓存维护,php不好处理,最后采用nodeJs来实现后端的逻辑功能。其实整个项目大体框架主要是公司另外一个人独立搭起来,之前也没有写过nodejs的,我就是后面加加业务代码,不过我有除了猫的基因遗传(说白了也就是位操作)没有看,其他基本都仔细看过来一便,毕竟是一个人搭建起来的,项目代码不是很多,感觉直接看大牛这样的实现也能学习到搭建框架的基础知识,不像很多历史项目,代码巨多,核心流程的看来看去的。主要是看管理的那一部分就行。
主要实现功能(一个成型的后端系统必然包括的几个方面)
- 数据存储方面,数据库采用mysql实现数据的增删改查
- 猫咪的遗传算法(这里其实是最简单的位运算操作实现,xx位表示猫的某个部位,以此类推);
- 网络方面(websocket协议 实现采用socket.io)
- 日志方面(没有采用任何日志库,自己实现的,就是简单的仿照Google的glog库的格式)
- 业务方面 (就是采用js的语法 没有嵌入其他语言[感觉这条是废话哈])
主要的框架
首先还是贴一下项目目录 ,这个对一个有经验的程序员还是比较能有条理的:
src ├── config.json ├── index.js ├── insert.sh ├── log ├── mod │ ├── client │ │ ├── client.js 一个客户端实例 │ │ └── clientMgr.js 管理客户端实例的集合 │ ├── config │ │ └── main.js 实现读表的逻辑 │ ├── const │ │ └── main.js 常量的统一定义 │ ├── genes │ │ ├── main.js 猫的基因操作 │ │ └── statis.js │ ├── msg │ │ ├── cmd.js 消息号定义 │ │ ├── msg.js 消息协议定义 json格式 │ │ └── retCode.js 消息的错误码定义 │ ├── mysql │ │ ├── account.js 账号表 │ │ ├── feedback.js 反馈表 │ │ ├── feed.js 猫的喂养表 │ │ ├── flow.js 流水表 │ │ ├── freeze.js 冻结资金表 │ │ ├── kv.js │ │ ├── leaseMarket.js 出租市场表 │ │ ├── main.js │ │ ├── op.js 操作记录表 │ │ ├── order.js 订单表 │ │ ├── pets.js 猫的信息表 │ │ ├── petsLooks.js 猫的外观 │ │ ├── petsPhote.js 猫的图片 │ │ ├── sellMarket.js 售卖市场表 │ │ ├── sqlDefine.js │ │ ├── test.js │ │ └── user.js 用户表 │ ├── net │ │ ├── server.js 服务的建立 │ │ └── socket.js socket实例 │ ├── order │ │ └── main.js 订单逻辑 │ ├── part │ │ ├── base.js 基本信息 │ │ ├── feed.js 喂养信息 │ │ ├── flow.js 流水信息 │ │ ├── freeze.js 冻结资金信息 │ │ ├── lease.js 出租信息 │ │ ├── market.js 市场信息 │ │ ├── pets.js 猫的信息 │ │ └── sample.js │ └── util │ ├── idMaker.js 唯一id生成(采用递增形式) │ ├── logger.js 日志模块 │ └── main.js 一些工具函数的定义 ├── orderCheck.js 模拟订单的交易进行 ├── package.json 这里可以对项目需要的库进行添加,在新部署的时候 npm install –save 即可nodejs即可完成对库的安装 ├── res │ └── xlsx 放各种资源 比如策划表 ├── sys.js 内部跑的生产0代猫 └── www ├── index.html 是测试网页 └── market.html
- 数据存储模块 采用的实现,很是方便load数据,不多讲,贴一个例子:
function createTable() {
var AccountModel = sequelize.import(process.cwd() '/mod/mysql/account');
var BaseModel = sequelize.import(process.cwd() '/mod/mysql/user');
sequelize.sync();
Logger.log('createTable DONE');
}
- 日志模块 这里实现还是比较简单的, 不过貌似我自己没有搜寻到类似的,不知道另外一个大牛怎么找到的,不过在此我贴出实现代码如下
Object.defineProperty(global, '__stack', {
get: function(){
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack){ return stack; };
var err = new Error;
Error.captureStackTrace(err, arguments.call);
var stack = err.stack;
Error.prepareStackTrace = orig;
return stack;
}
});
Object.defineProperty(global, '__line__', {
get: function(){
return __stack[4].getLineNumber();
}
});
Object.defineProperty(global, '__filename__', {
get: function(){
return __stack[4].getFileName();
}
});
// 这样相当于在全局定义了新的俩个属性 ,可以直接调用
console.log('[' __filename__ ':' __line__ '] '); //即可打印出当前的文件和行数,方便debug
- 业务方面 不多说 其实也只是简单的增删改查。
- 网络方面
这个其实写的也比较简单,没有使用任何库,主要是学习下作为服务器如何管理多个用户的连接吧。 话说服务器不就是做这个事情的嘛,底层通讯的问题一般都使用成熟的库,在此是socket.io 作为现在程序员要做的,基本上学习网络通讯库的api使用,主要还是管理多个连接问题嘛,底层的通讯一般都不需要程序员自己写了,也没必要花那些精力和时间,不过必要的了解原理还是需要的,不然没使用的出的bug,就不要无处判断了。