Created
September 10, 2010 13:56
-
-
Save comfuture/573666 to your computer and use it in GitHub Desktop.
nano framework for node.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
with (require('./nano')) { | |
get('/hello', 'Hello, world'); | |
get('/index.html', readfile('index.html')); | |
static_file('/about.html'); | |
get('/bye', function() { | |
return 'Bye~ ' + request.args['name']; | |
}); | |
get('/rand', function() { | |
return '' + Math.ceil(Math.random() * 100000); | |
}); | |
get(/\/greet\/(.*)/, function(match) { | |
return 'Halo, ' + match[1]; | |
}); | |
server.listen(8124); | |
console.log('Server running at http://127.0.0.1:8124/'); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require('http'); | |
var URL = require('url'); | |
var fs = require('fs'); | |
COMMON_HEADERS = {}; | |
var urlmap = { | |
'GET': [], 'POST': [], 'PUT': [], 'DELETE': [] | |
}; | |
function isArray(o) { | |
return (o.constructor.toString().indexOf('Array') > -1); | |
} | |
function error(code, message) | |
{ | |
exports.response.writeHead(code); | |
exports.response.end(message); | |
} | |
exports.error = error; | |
function write(content, headers) { | |
exports.response.writeHead(200, {'Content-Type': 'text/html'}); | |
exports.response.end(content); | |
} | |
exports.write = write; | |
function readfile(filename) { | |
return function() { | |
return fs.readFileSync(filename); | |
} | |
} | |
exports.readfile = readfile; | |
function addrule(method, pattern, func) { | |
if (isArray(method)) { | |
for (m in method) { | |
addrule(m, pattern, func); | |
} | |
return; | |
} | |
var pair = [pattern, func]; | |
urlmap[method.toUpperCase()].push(pair); | |
} | |
exports.addrule = addrule; | |
/* | |
for (method in urlmap) { | |
console.log('method added:', method); | |
exports[method.toLowerCase()] = function(pattern, func) { | |
addrule(method, pattern, func); | |
} | |
} | |
*/ | |
exports.get = function(pattern, func) { | |
addrule('GET', pattern, func); | |
}; | |
exports.post = function(pattern, func) { | |
addrule('POST', pattern, func); | |
} | |
exports.static_file = function(path) { | |
addrule('GET', path, readfile(path.substr(1))); | |
} | |
exports.static_dir = function(dir) { | |
addrule('GET', new RegExp('^'+dir+'/(.*)'), function(match) { | |
readfile(match); | |
}); | |
} | |
function _do_response(req, res) { | |
var _parsed = URL.parse(req.url, true); | |
req.path = _parsed.pathname; | |
req.args = _parsed.query; | |
exports.request = req; | |
exports.response = res; | |
var error = function(code, message) { | |
exports.response.writeHead(404); | |
exports.response.end('404 Not Found'); | |
} | |
var method = req.method.toUpperCase(); | |
var _make_response = function(ret, match) { | |
if (typeof ret == 'string') { | |
write(ret); | |
return true; | |
} else if (typeof ret == 'function') { | |
write(ret(match)); | |
return true; | |
} else if (isArray(ret)) { | |
// do something | |
} | |
return false; | |
} | |
for (var i = 0, cnt = urlmap[method].length; i < cnt; i++) { | |
var ret = false; | |
var pattern = urlmap[method][i][0]; | |
if (typeof pattern.test == 'function') { | |
var match = pattern.exec(req.path); | |
if (match) | |
ret = _make_response(urlmap[method][i][1], match); | |
} else if (typeof pattern == 'string' && pattern == req.path) { | |
ret = _make_response(urlmap[method][i][1]); | |
} | |
if (ret) { | |
return; | |
} | |
} | |
error(404); | |
} | |
exports.server = http.createServer(_do_response); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment