codekart
Version:
Web application framework for Node.js
83 lines (68 loc) • 2.37 kB
JavaScript
/**
* 数据接口服务器
*/
var path = require('path');
var util = require('util');
var route = load.core('!server/route');
var view = load.core('!view/view');
var callthis = load.core('!server/callthis');
var conThis = new callthis();
var json = load.tool('!json');
var config = load.config();
module.exports = function(request,response){
var pathname = request.url.pathname
, pathary = splitPathname(pathname)
, pleg = pathary.length
, controller = 'index'
, action = 'index';
//控制器路由
if(request.route){ // 已经注册的控制器路由
controller = request.route.controller;
action = request.route.action;
}else if(pleg==1){ // /controller
controller = pathary[0];
}else if(pleg==2){ // /controller/action
controller = pathary[0];
action = pathary[1];
}else{ // /path/path/controller/action
controller = path.dirname(pathname);
action = path.basename(pathname);
}
//初始化本地对象
conThis.__init(request,response);
//如果为调试模式,直接调用,出错则抛出
if(config.debug){
load.app('controller/'+controller)[action].call(conThis);
return;
}
// 非调试模式 异常处理
//控制器本地服务对象
var controllerOb;
//尝试加载控制器
try{
controllerOb = load.app('controller/'+controller); //加载并调用方法
}catch (e){
if(config.debug) log(e);
return view.render(request,response,'404');
}
if(typeof controllerOb[action]!='function'){
return view.render(request,response,'404');
}
//尝试调用控制器方法
try{
controllerOb[action].call(conThis); //加载并调用方法
}catch (e){
ok = false; //调用失败
request.error_msg = util.inspect(e);
//request.error_msg = 'controller ['+controller+'] or action ['+action+'] runtime error !';
view.render(request,response,'error');
}
};
function splitPathname(pathname){
var old = pathname.split('/')
, ret = [];
for(var k in old){
if(old[k]) ret.push(old[k]);
}
return ret;
}