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 连接池客户端等等

吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头分割线羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头吐舌头羡慕吐舌头吐舌头


0 0
原创粉丝点击