这是目录结构
app-node.js
/**
* @author Administrator
* 请求的路由选择
*/
var http_port = 8124;
var http = require('http');
var htutil = require('./htutil');
var server = http.createServer( function(req, res){
htutil.loadParams(req, res, undefined);
if(req.requrl.pathname === '/'){
require('./home-node').get(req, res);
}else if(req.requrl.pathname === '/square'){
require('./square-node').get(req, res);
}else if(req.requrl.pathname === '/fibo'){
require('./fibo-node').get(req, res);
}else {
res.writeHead(404, {'Content-Type':'text/plain'});
res.end('bad URL ' + req.url);
}
});
server.listen(http_port);
console.log('listening to http://localhost:8124');
home-node.js
var htutil = require('./htutil');
exports.get = function(req, res){
res.writeHead(200, {'Content-Type':'text/html'});
res.end(
htutil.page('home',
htutil.navbar(),
" <p>home</p>" )
);
}
/*
* 处理URL查询参数
*/
var url = require('url');
exports.loadParams = function(req, res, next){
req.requrl = url.parse(req.url, true);
req.a = (req.requrl.query.a && ! isNaN(req.requrl.query.a))
? new Number(req.requrl.query.a)
: NaN;
req.b = (req.requrl.query.b && !isNaN(req.requrl.query.b))
? new Number(req.requrl.query.b)
: NaN;
if(next) next();
}
//这个函数提供了一个HTML片段,可以作为一个导航栏
exports.navbar = function(){
return ["<div calss='navbar'>",
"<p><a href='/'>home</a></p>",
"<p><a href='/square'>square</a></p>",
"<p><a href='/fibo'>factorial</a></p>",
"</div>"].join('\n');
}
//这个函数对用整个页面的HTML结构
exports.page = function(title, navbar, content){
return ["<html><head><title>{title}</title></head>",
"<body><h1>{navbar}</h1>{content}</body></html>"].join('\n')
.replace("{title}", title, "g")
.replace("{navbar}", navbar, "g")
.replace("{content}", content, "g");
}
square-node.js
//计算一个数的平方并显示
var htutil = require('./htutil');
exports.get = function(req, res){
res.writeHead(200, {'Content-Type':'text/html'});
res.end(
htutil.page('square', htutil.navbar(), [
(!isNaN(req.a)?
("<p>{a} aquare = {sq}</p>".replace("{a}", req.a).replace("{sq}", req.a*req.a))
: ""
),
"<p>entet a number to see its square</p>",
"<form name='square' action='./square' method='get'>",
"A: <input type='text' name='a' />",
"</form>"
].join('\n'))
);
}
fibo-node.js
var htutil = require('./htutil');
var math = require('./math');
exports.get = function(req, res){
res.writeHead(200, {'Content-Type':'text/html'});
res.end(
htutil.page('square', htutil.navbar(), [
(!isNaN(req.a)?
("<p>{a} fibo = {fibo}</p>".replace("{a}", Math.floor(req.a)).replace("{fibo}", math.fibonacci(Math.floor(req.a))))
: ""
),
"<p>entet a number to see its fibonacci</p>",
"<form name='fibo' action='./fibo' method='get'>",
"A: <input type='text' name='a' />",
"</form>"
].join('\n'))
);
}
math.js
var fibonacci = exports.fibonacci = function(n){
if(n === 1)
return 1;
else if(n === 2)
return 1;
else
return fibonacci(n-1) + fibonacci(n-2);
}
运行结果: