Browse Source

Complate router && mysql,mongodb init.

HonorLee 7 years ago
parent
commit
e206f98465
8 changed files with 165 additions and 44 deletions
  1. 5 2
      config.js
  2. 2 0
      package.json
  3. 1 1
      server.js
  4. 35 2
      system/core.js
  5. 27 0
      system/lib/core/image.js
  6. 44 38
      system/lib/core/router.js
  7. 0 1
      system/lib/core/session.js
  8. 51 0
      system/lib/core/static.js

+ 5 - 2
config.js

@@ -15,7 +15,8 @@ global.Config = {
         port:3389,
         user:'root',
         password:'',
-        database:''
+        database:'',
+        prefix:''
     },
     //Mongodb config
     mongodb_on : false,
@@ -24,7 +25,9 @@ global.Config = {
         port:27017,
         user:null,
         password:'',
-        database:''
+        database:'',
+        prefix:''
+
     },
     //If Debug on,log && info logs will output in console;except Error!
     debug:true,

+ 2 - 0
package.json

@@ -18,7 +18,9 @@
     "js-base64": "^2.1.9",
     "md5": "^2.2.1",
     "mime-types": "^2.1.11",
+    "mongodb": "^2.2.25",
     "mysql": "^2.11.1",
+    "path": "^0.12.7",
     "querystring": "^0.2.0",
     "request": "^2.72.0",
     "tracer": "^0.8.3"

+ 1 - 1
server.js

@@ -19,7 +19,7 @@ let serverPort = 8000;
 try{
     require('http').createServer(serverHandler).listen(serverPort);
     LOGGER.info('Child Server start at port [' + serverPort + '] | ' + DateFormat('yyyy/MM/dd hh:mm:ss', new Date()));
-}else{
+}catch(e){
     LOGGER.error('Child Server failed start at port [' + serverPort + '] | ' + DateFormat('yyyy/MM/dd hh:mm:ss', new Date()));
 }
 

+ 35 - 2
system/core.js

@@ -27,6 +27,9 @@ global.Base64       = require('js-base64');
 global.MD5          = require('md5');
 global.DateFormat   = require('date-format');
 global.Formidable   = require('formidable');
+global.MIME         = require('mime-types');
+global.Path         = require('path');
+
 global.Tracer       = require('tracer').dailyfile({root:Core.Path.Log,format : "{{timestamp}} <{{title}}> {{file}}:{{line}} {{message}}", dateformat : "HH:MM:ss.L"});
 
 //System Library load
@@ -58,8 +61,38 @@ if(Config && Config.mysql_on && Config.mysql_cfg){
         pool:Core.Setting.mysql_pool,
         db:Config.mysql_cfg
     };
-    global.MysqlPool  = require(Core.Path.ExtraLib + '/mysql-pool.js').instance(mysqlConfig);
-    global.MysqlDB    = require(Core.Path.Helper + '/mysqldb.js');
+    let MysqlPool  = require(Core.Path.ExtraLib + '/mysql-pool.js').instance(mysqlConfig);
+    
+    // global.MysqlPool  = require(Core.Path.ExtraLib + '/mysql-pool.js').instance(mysqlConfig);
+    // global.MysqlDB    = require(Core.Path.Helper + '/mysqldb.js');
+    MysqlPool.getConnection(Core.Setting.mysql_pool.name).query('SELECT VERSION() as version',function(err,result,fields){
+        if(err){
+            LOGGER.error('Mysql Connect error,please recheck your config');
+            LOGGER.error(err);
+        }else{
+            LOGGER.info('Mysql Connect success');
+            LOGGER.info('Mysql Version: ' + result[0]['version'] + ' | User: ' + Config.mysql_cfg.user + ' | Database: ' + Config.mysql_cfg.database);
+            global.MysqlPool = MysqlPool;
+            global.MysqlDB   = require(Core.Path.Helper + '/mysqldb.js');
+        }
+    });
+}
+
+//If Mongodb on,load Mongodb Extension
+if(Config && Config.mongodb_on && Config.mongodb_cfg && Config.mongodb_cfg.database){
+    let verify = Config.mongodb_cfg.user?Config.mongodb_cfg.user+':'+Config.mongodb_cfg.password+'@':'';
+    let mongoConnect = 'mongodb://' + verify + Config.mongodb_cfg.host+':'+Config.mongodb_cfg.port+'/'+Config.mongodb_cfg.database;
+    require('mongodb').MongoClient.connect(mongoConnect,function(err,db){
+        if(err) {
+            Logger.error('MongoDB connect error!',true);
+            Logger.error('Server start failed. Log has been saved!');
+            // Logger.out(err);
+            return;
+        }
+        LOGGER.info('Mongodb Connect success');
+        global.MongoDB = {db:db};
+        
+    });
 }
 
 //Check File Paths

+ 27 - 0
system/lib/core/image.js

@@ -0,0 +1,27 @@
+'use strict'
+//TODO Rewrite
+var mime = require('mime-types');
+var Image = {
+    load:function(path,ext,req,res){
+        let data,pathArr,opts={},tmpFile;
+        if(FILE.existsSync(path)){
+            try{
+                data = FILE.readFileSync(path,'binary');
+                res.writeHead(200, { "Content-Type": mime.lookup(ext)});
+                res.end(data,'binary');
+                return true;
+            }catch(err){
+                Image._error();
+            }
+        }else{
+            // console.log(err);
+            Image._error(res);
+        }
+
+    },
+    _error:function(res){
+        res.writeHead(404, {'Content-Type': 'text/html'});
+        res.end();
+    }
+}
+module.exports = Image;

+ 44 - 38
system/lib/core/router.js

@@ -1,45 +1,52 @@
 'use strict'
 var Router ={
-    go:function(res,req){
-
-
-
-        let query = URLParse.query;
-
-
-        if(enterURI.match(WhiteList.HandlerRules)){
-            return Router.getHandler(url,res,req);
-        }else if(enterURI.match(WhiteList.StaticRules)){
-            return STATIC.load(ROOTPATH+URLParse.pathname,query,res);
-        }else{
-            Router._error('Router Go ERROR:'+url,res);
-            Logger.error(url+' WhiteList Check error!');
-        }
+    goAsset:function(path,req,res){
+        let assetFile = Core.Path.Asset+path;
+        FILE.stat(assetFile,function(err,status){
+            if(err || !status.isFile()){
+                Router._error('path',res);
+            }else{
+                STATIC.load(assetFile,req,res);
+            }
+        });
     },
-    getHandler:function(url,res,req){
-        let URLParse = URL.parse(HANDLERPATH+url,true);
-        let URLArr = URLParse.pathname.split('/');
-        if(URLArr[URLArr.length-1]=='') URLArr[URLArr.length-1]='index';
-        let FileName = URLArr.join('/')+'.js';
-        let mod,call='index';
-        if(!FILE.existsSync(FileName)){
-            call = URLArr.pop();
-            FileName = URLArr.join('/')+'.js';
-        }
-        try{
-            mod = require(FileName);
-            if(mod['__construct']){
-                let cons = mod['__construct'](res,req,URLParse.query);
-                if(cons && cons.status=='error') Router._error('Router Go ERROR:'+cons.msg,res);
+    goHandler:function(path,req,res){
+        let handlerFile = Core.Path.Handler + path + '.js';
+        let method = 'index';
+        let pathArr = path.split('/');
+        let Res = res;
+        let Req = req;
+        FILE.stat(handlerFile,function(err,status){
+            if(err || !status.isFile()){
+                method = pathArr.pop();
+                handlerFile = Core.Path.Handler + pathArr.join('/') + '.js';
+                FILE.stat(handlerFile,function(err,status){
+                    if(err || !status.isFile()){
+                        Router._error('No such handler ['+handlerFile+']',Res);
+                    }else{
+                        Router.runHandler(handlerFile,method,Req,Res);
+                    }
+                });
+            }else{
+                Router.runHandler(handlerFile,method,Req,Res);
             }
-            mod[call](res,req,URLParse.query);
-        }catch(err){
-            Logger.error(err);
-            res.writeHead(404, {'Content-Type': 'text/html'});
-            res.end('404');
+        });
+    },
+    runHandler:function(handlerFile,method,req,res){
+        try {
+            let handler = require(handlerFile);
+            if(typeof handler[method]==='function'){
+                if(typeof handler['__construct']==='function') handler['__construct'](req,res);
+                handler[method](req,res);
+            }else{
+                Router._error('Handler ['+handlerFile+'] no such method "'+method+'"',res);
+            }
+        }catch(e){
+            Router._error(e,Res);
         }
     },
-    _error:function(log,res,req){
+    _error:function(log,res){
+        LOGGER.error(log);
         res.writeHead(404, {'Content-Type': 'text/html'});
         res.end('404');
     }
@@ -50,7 +57,7 @@ module.exports = function(req,res){
     let URLParse  = URL.parse(URI,true);
     let URLArr    = URLParse.pathname.split('/');
     let enterURI  = String(URLArr[1])==''?'index':String(URLArr[1]);
-    let isAsset   = enterURI==Config.asset_path?true:false;
+    let isAsset   = enterURI == Config.asset_path;
 
     req._GET = URLParse.query;
     if(isAsset){
@@ -69,7 +76,6 @@ module.exports = function(req,res){
         }
         req._Cookie[key] = value;
     });
-
     Router.goHandler(URLParse.pathname,req,res);
     return this;
 };

+ 0 - 1
system/lib/core/session.js

@@ -2,7 +2,6 @@
 var Session = {
     set:function(key,value,sessionid){
         if(!key || !value) return null;
-
         let sessionData;
         if(sessionid){
             try{

+ 51 - 0
system/lib/core/static.js

@@ -0,0 +1,51 @@
+'use strict'
+//TODO Rewrite
+var Static = {
+    load:function(assetFile,req,res){
+        let ext = Path.extname(assetFile);
+        if(!ext||ext==''){
+            res.writeHead(404, {'Content-Type': 'text/html'});
+            res.end();
+            return;  
+        }
+        if(ext.match(/png|jpg|jpeg|gif/)){
+            // res.writeHead(404, {'Content-Type': 'text/html'});
+            // res.end();
+            IMAGE.load(URL.parse(assetFile,true).pathname,ext,req,res);
+        }else if(FILE.existsSync(assetFile)){
+            var data;
+            if(ext.match(/txt|js|css|html|json/)){
+                try{
+                    data = FILE.readFileSync(assetFile,'utf-8');
+                }catch(err){
+                    res.writeHead(404, {'Content-Type': 'text/html'});
+                    res.end();
+                    return false;            
+                }
+                if(ext.match(/json/)){
+                    res.writeHead(200, { "Content-Type": MIME.lookup(ext)+';charset=utf-8'});
+                    res.end(data,'utf-8');
+                }else{
+                    res.writeHead(200, { "Content-Type": MIME.lookup(ext)+';charset=utf-8','Content-Encoding':'gzip'});
+                    res.end(data,'utf-8');
+                }
+                 //console.log(query)   
+            }else if(ext.match(/json/)){
+            }else{
+                try{
+                    data = FILE.readFileSync(assetFile,'binary');
+                    res.writeHead(200, { "Content-Type": MIME.lookup(ext),"Access-Control-Allow-Origin":"*"});
+                    res.end(data,'binary');
+                }catch(err){
+                    res.writeHead(404, {'Content-Type': 'text/html'});
+                    res.end();
+                }
+            }
+        }else{
+            res.writeHead(404, {'Content-Type': 'text/html'});
+            res.end();
+        }
+    }
+}
+
+module.exports=Static;