mnode项目
来源:互联网 发布:淘宝剑三稻香村 编辑:程序博客网 时间:2024/05/14 15:30
最近做个一个node.js工具包,完成了大部分功能,还在开发中,分享之...
github地址:https://github.com/zhengjinwei123/mnode/tree/develop
/** * Created by 郑金玮 on 2016/11/23. * 测试用例 */var Path = require('path');var JadeLoader = require("../plugin/app").JadeLoader;var HttpServer = require("../plugin/app").HttpServer;var LogUtil = require("../utils/app").Logger;var Singleton = require("../utils/app").Singleton;var logger = Singleton.getDemon(LogUtil, Path.join(__dirname, "../config/logger.json"), Path.join(__dirname, "../logs"));var WSocketServer = require("../plugin/app").WSServer;JadeLoader.init(Path.join(__dirname, "../"), true, 60, function () { var httpS = new HttpServer(9090, "127.0.0.1", { filtersFunc: [ function (message) { return true; } ] }, Path.join(__dirname, "../../httpServerTest")); httpS.createServer(); httpS.on("ready", function (data) { logger.info("Http", data); }); httpS.on("error", function (data) { logger.info("Http", data); }); httpS.on("connect-connect", function (data) { logger.info("Http", data); }); httpS.on("connect-error", function (error) { logger.info("Http", error); }); httpS.on("connect-disconnect", function (data) { logger.info("Http", data); }); httpS.on("connect-response", function (data) { logger.info("Http", data); }); httpS.on("connect-errorcode", function (code) { logger.info("Http", code); }); /** * 测试websocket */ var wss = Singleton.getDemon(WSocketServer, "127.0.0.1", 9091); wss.on("message", function (msg) { console.log("ws:", msg); }); wss.on("connection", function (socket, param) { socket.send("连接成功"); console.log("连接成功", param.host) }); wss.on('close', function (param) { console.log("客户端断开连接", param.host); }); wss.once("listening", function () { console.log("listening"); }); wss.on("error", function (err) { console.error(err); }); JadeLoader.Jader('utils').get('file-utils').readAsync("c://start_nginx-php7.bat", function (err, resp) { console.log(err, resp) }); /** * 测试httpclient */ var HttpClient = Singleton.getDemon(JadeLoader.Jader('utils').get('httpclient-utils'), '127.0.0.1', 9090, 2); setInterval(function () { HttpClient.Post("index", "zjw", function (err, resp) { console.log("http post response:", err, resp); }); }, 2000); /** * 测试 udpserver * @type {exports.UdpServer|*} */ var UdpServer = require("../plugin/app").UdpServer; var d = new UdpServer(); d.on('listening', function (address) { console.log("server listening " + address.address + ":" + address.port); }); d.on('message', function (msg, rinfo) { console.log('Received %d bytes msg:%s from %s:%d\n', msg.length, msg, rinfo.address, rinfo.port); }); d.on('error', function (error) { console.error(error.stack); }); setInterval(function () { console.log("--------start send data by udp protocal----------------"); var UdpClient = require("../utils/app").UdpClient; var messgae = new UdpClient("127.0.0.1", 9092); //messgae.push_string("zhengjinwei", 20); //messgae.push_string("male", 10); //messgae.push_string("my name is zhengjinwei", 100); //messgae.push_int32(212121212); messgae.send("zhengjinwei"); }, 1000); /** * 测试Date */ console.log(new Date().normalize())});JadeLoader.on("error", function (err) { console.error(err);});JadeLoader.on("hotLoad", function (resp) { console.log(resp);});
1.快速搭建 Http API服务
var HttpServer = require("../plugin/app").HttpServer;
var httpS = new HttpServer(9090, "127.0.0.1", { filtersFunc: [ function (message) { return true; } ] }, Path.join(__dirname, "./httpServerTest")); httpS.createServer(); httpS.on("ready", function (data) { logger.info("Http", data); }); httpS.on("error", function (data) { logger.info("Http", data); }); httpS.on("connect-connect", function (data) { logger.info("Http", data); }); httpS.on("connect-error", function (error) { logger.info("Http", error); }); httpS.on("connect-disconnect", function (data) { logger.info("Http", data); }); httpS.on("connect-response", function (data) { logger.info("Http", data); }); httpS.on("connect-errorcode", function (code) { logger.info("Http", code); });
说明:
自动生成 httpServerTest文件夹:
根据请求在get 或者post下面添加文件即可,支持过滤器,session,https
2.快速搭建 express web服务
基于express框架
var ExpressPlugin = require("../app");var Path = require("path");var d = new ExpressPlugin('localhost', 9095, Path.join(__dirname, "../expressTest"));d.start(function () { console.log("ready");});d.on('uncaughtException', function (err) { console.error('Got uncaughtException', err.stack, err); if (d.env() == 'development') { process.exit(1); }});自动生成express环境目录:
支持多层路由,例如:http://localhost:9095/user/login
3.快速搭建 热加载器服务 JadeLoader
代码中无处不在的require 和重复的require 增加了编码重复性,现在只要启动JadeLoader,即可在其他地方同种方式调用模块,同时可做简单内存(单进程,暂时不支持多进程),存储一些用户全局变量
var Path = require('path');var JadeLoader = require("../plugin/app").JadeLoader;JadeLoader.init(Path.join(__dirname, "../"), true, 60, function () { JadeLoader.Jader('utils').get('file-utils').readAsync("c://start_nginx-php7.bat", function (err, resp) { console.log(err, resp) }); /** * 测试httpclient */var Singleton = require("./utils/app").Singleton; var HttpClient = Singleton.getDemon(JadeLoader.Jader('utils').get('httpclient-utils'), '127.0.0.1', 9090, 2); setInterval(function () { HttpClient.Post("index", "zjw", function (err, resp) { console.log("http post response:", err, resp); }); }, 2000);});JadeLoader.on("error", function (err) { console.error(err);});JadeLoader.on("hotLoad", function (resp) { console.log(resp);});说明:
JadeLoader.init 的第一个参数是让加载器接管的全局文件夹路径,它会扫描改文件夹下所有的名为:jadeContext.json 文件:
文件内容如下:
scan-dir:是否扫描当前文件夹,false则启用scan-dir-list字段,dir-name:文件夹名,app-name:文件名,hot:是否热加载
{ "scan-dir": true, "scan-dir-list": [ { "dir-name": "obj-utils", "app-name": "app.js", "hot": true }, { "dir-name": "singleton-utils", "app-name": "app.js", "hot": true }, { "dir-name": "time-utils", "app-name": "app.js", "hot": true }, { "dir-name": "type-utils", "app-name": "app.js", "hot": true }, { "dir-name": "timer-utils", "app-name": "app.js", "hot": true } ]}
调用方法:
JadeLoader.jader(模块所处文件夹名).get(模块文件名)
4.快速搭建 moogoose 数据库服务
地址:https://github.com/zhengjinwei123/mnode/tree/develop/mnode/mnode/utils/db-mongodb
/** * Created by 郑金玮 on 2016/12/13. */var Mongoose = require('mongoose');var Schema = Mongoose.Schema;var poolModule = require('generic-pool');var Util = require("util");var Emitter = require("events").EventEmitter;var FileUtil = require("../app").File;var Path = require("path");var _ = require("lodash");var MongodbUtil = function (host, port, db, userOption, runPath) { Emitter.call(this); this.host = host || '127.0.0.1'; this.port = port || 27017; this.db = db; this.dbUrl = null; if (userOption == undefined) { this.dbUrl = Util.format("mongodb://%s:%d/%s", this.host, this.port, db); } else { if (userOption['user'] && userOption['password']) { this.dbUrl = Util.format("mongodb://%s:%s@%s:%d/%s", userOption.user, userOption.password, this.host, this.port, db); } } if (this.dbUrl == null) { throw new Error("args error"); } this.runPath = runPath || Path.join(__dirname, "/schemas"); var _error = null; try { if (!FileUtil.isExists(this.runPath)) { FileUtil.createDirectory(this.runPath); var templateContent = FileUtil.readSync(Path.join(__dirname,"/template.js")); FileUtil.writeSync(Path.join(this.runPath,"/demon.js"),templateContent); } } catch (e) { _error = e.message; } finally { if (_error) { console.error(_error); process.exit(1); } } var self = this; self.connected = false; this.pool = poolModule.Pool({ name: 'mongoose', create: function (callback) { var conn = Mongoose.createConnection(self.dbUrl); conn.on('error', function (error) { callback(error); }); conn.once('connected', function () { callback(null, conn); }); conn.on('disconnected', function () { console.error('disconnected'); }); }, destroy: function (db) { db.close(); }, max: 20, idleTimeoutMillis: 30000, log: false }); this.runList = {}; this.modelName = null; this.loadSchema();};MongodbUtil.prototype.loadSchema = function () { var schemaFileList = FileUtil.traverseSync(this.runPath); var self = this; schemaFileList.forEach(function (f) { var scheme = require(f.path); if (scheme['table'] && scheme['schema']) { self.runList[scheme.table] = self.runList[scheme.table] || scheme.schema; } });};MongodbUtil.prototype.exec = function (callback) { var self = this; this.pool.acquire(function (err, client) { var release = function () { self.pool.release(client); }; if (!err) { callback(null, client, release); } else { release(); callback(err.stack); } }, 0);};MongodbUtil.prototype.schema = function (modelName) { if (this.runList[modelName]) { this.modelName = modelName; return this; } else { throw new Error(modelName + " is not undefine"); }};MongodbUtil.prototype.model = function (callback) { if (this.modelName == null) { callback("please call schema method first"); } else { var self = this; this.exec(function (err, client, release) { if (!err) { callback(null, client.model(self.modelName, self.runList[self.modelName]), release); } else { callback(err); } }); }};module.exports = MongodbUtil;
template.js:
/** * Created by zhengjinwei on 2016/12/15. */var Mongoose = require('mongoose');var schemeTable = { name: {type: String}, age: {type: Number}};var schema = new Mongoose.Schema(schemeTable, {});schema.statics.getData = function (callback) { var condition = {}; var view = {_id: 0}; this.find(condition, view).lean().exec(function (err, docs) { callback(err, docs); })};schema.statics.insertData = function (callback) { var newData = new this(); newData.name = 'zhengjinwei'; newData.age = 26; newData.save(newData,function (err, resp) { callback(err, resp); })};module.exports = { "table": 'student', 'schema': schema};
自动在指定路径下生产schema文件夹,你只要的这个文件夹下写你的数据库操作逻辑即可,look:
测试用例:
/***** * 测试用例 */var MongodbUtil = require("./app");var d = new MongodbUtil("localhost", 27017, 'mydb');d.schema('student').model(function (err, model, release) { if (!err) { model.getData(function (err, docs) { console.log(err, docs); release(); }) } else { console.error(err); }});d.model(function (err, model, release) { if (!err) { model.insertData(function (err, docs) { console.log(err, docs); release(); }) } else { console.error(err); }});
此外,还有其他各种工具类和服务,例如websocket(包括客户端,服务端),UDP(包括客户端,服务端),
单例生成器(Singleton),redis,mysql,mongodb 连接池客户端等等
分割线
- mnode项目
- mnode项目-第二篇
- mnode第三篇 在mysql之上搭建redis缓存
- Block[Table[mnode:2,/opt/resin_push/resin-data/self-service/distcache/mnode.db],1b8002,copy=false,lo
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- 项目
- MDS(multidimensional scaling)多维尺度分析
- 嵌入式linux基础教程 第九章 文件系统(1)
- CSS3——写一个下滑线的展开与合上
- Android手机 内置无线网卡 一边连WIFI 一边开SoftAP
- 上升子序列
- mnode项目
- maven 常用命令
- ARM立即数,LDR和MOV的区别
- SpringWebsocket +Stomp+SockJS实现消息订阅和推送
- Windwos 7 Install WordPress
- 动态分区分配算法
- https原理:证书传递、验证和数据加密、解密过程解析
- structs2学习(三):使用公用结果集
- FileChangedReloadingStrategy的简单使用