app-node.js

var http_port = ;

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 === '/factorial'){
require('./factorial-node').get(req, res);
}else if (req.requrl.pathname === '/fibonacci'){
require('./fibo-node').get(req, res);
}else if (req.requrl.pathname === '/mult'){
require('./mult-node').get(req, res);
}else{
res.writeHead(, {'Content-Type': 'text/plain'});
res.end("bad URL" + req.url);
}
}); server.listen(http_port);
console.log('listening to http://localhost:3000');

htutil.js

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();
} exports.navbar = function(){
return ["<div class='navbar'>",
"<p><a href='/'>home</a></p>",
"<p><a href='/mult'>Multiplication</a></p>",
"<p><a href='/square'>Square</a></p>",
"<p><a href='/factorial'>Factorial</a></p>",
"<p><a href='/fibonacci'>Fibonacci</a></p>",
"</div>"].join('\n');
} exports.page = function(title, navbar, content){
return ["<html><head><title>{title}</title></head>",
"<body><h1>{title}</h1>",
"<table><tr>",
"<td>{navbar}</td><td>{content}</td>",
"</tr></table></body></html>"
].join('\n')
.replace(new RegExp("{title}", "gm"), title)
.replace("{navbar}", navbar)
.replace("{content}", content);
}

home-node.js

var htutil = require('./htutil');

exports.get = function(req, res){
res.writeHead(, {'Content-Type': 'text/html'});
res.end(htutil.page("Math Wizard", htutil.navbar(), "<p>Math Wizard</p>"));
}

square-node.js

var htutil = require('./htutil');
exports.get = function(req, res){
res.writeHead(, {'Content-Type': 'text/html'});
var result = req.a * req.a;
res.end(
htutil.page("Square", htutil.navbar(), [
(!isNaN(req.a) ?
("<p class='result'>{a} squared = {sq}</p>"
.replace("{a}", req.a)
.replace("{sq}", req.a * req.a))
: ""),
"<p>Enter numbers to see its square</p>",
"<form name='square' action='/square' method='get'>",
"A: <input type='text' name='a' /><br/>",
"<input type='submit' value='Submit' />",
"</form>"
].join('\n'))
);
}

factorial-node.js

var htutil = require('./htutil');
var math = require('./math'); exports.get = function(req, res){
res.writeHead(, {'Content-Type': 'text/html'});
res.end(
htutil.page("Factorial", htutil.navbar(), [
(!isNaN(req.a) ?
("<p class='result'>{a} factorial = {fact}</p>"
.replace("{a}", req.a)
.replace("{fact}", math.factorial(Math.floor(req.a))))
: ""),
"<p>Enter numbers to see its factorial</p>",
"<form name='factorial' action='/factorial' method='get'>",
"A: <input type='text' name='a' /><br/>",
"<input type='submit' value='Submit' />",
"</form>"
].join('\n'))
);
}

mult-node.js

var htutil = require('./htutil');
exports.get = function(req, res){
res.writeHead(, {'Content-Type': 'text/html'});
var result = req.a * req.b;
res.end(
htutil.page("Multiplication", htutil.navbar(), [
(!isNaN(req.a) && !isNaN(req.b) ?
("<p class='result'>{a} * {b} = {result}</p>"
.replace("{a}", req.a)
.replace("{b}", req.b)
.replace("{result}", req.a * req.b))
: ""),
"<p>Enter numbers to mutiply</p>",
"<form name='mult' action='/mult' method='get'>",
"A: <input type='text' name='a' /><br/>",
"B: <input type='text' name='b' /><br/>",
"<input type='submit' value='Submit' />",
"</form>"
].join('\n'))
);
}

fibo-node.js

var htutil = require('./htutil');
var math = require('./math'); exports.get = function(req, res){
res.writeHead(, {'Content-Type': 'text/html'});
res.end(
htutil.page("Fibonacci", htutil.navbar(), [
(!isNaN(req.a) ?
("<p class='result'>{a} fibonacci = {fibo}</p>"
.replace("{a}", Math.floor(req.a))
.replace("{fibo}", math.fibonacci(Math.floor(req.a))))
: ""),
"<p>Enter numbers to see its fibonacci</p>",
"<form name='fibonacci' action='/fibonacci' method='get'>",
"A: <input type='text' name='a' /><br/>",
"<input type='submit' value='Submit' />",
"</form>"
].join('\n'))
);
}

fibo2-node.js

var htutil = require('./htutil');
var math = require('./math'); function sendResult(req, res, a, fiboval){
res.writeHead(, {'Content-Type': 'text/html'});
res.end(
htutil.page("Fibonacci", htutil.navbar(), [
(!isNaN(fiboval) ?
("<p class='result'>{a} fibonacci = {fibo}</p>"
.replace("{a}", a)
.replace("{fibo}", fiboval))
: ""),
"<p>Enter numbers to see its fibonacci</p>",
"<form name='fibonacci' action='/fibonacci' method='get'>",
"A: <input type='text' name='a' /><br/>",
"<input type='submit' value='Submit' />",
"</form>"
].join('\n'))
);
} exports.get = function(req, res){
if (!isNaN(req.a)){
math.fibonacciAsync(Math.floor(req.a), function(val){
sendResult(req, res, Math.floor(req.a) ,val);
});
}else {
sendResult(req, res, NaN, NaN);
}
}

math.js

var factorial = exports.factorial = function(n){
if (n == )
return ;
else
return n * factorial(n-);
} var fibonacci = exports.fibonacci = function(n){
if (n === )
return ;
else if (n === )
return ;
else
return fibonacci(n-) + fibonacci(n-);
} var fibonacciAsync = exports.fibonacciAsync = function(n, done){
if (n == || n == )
done();
else {
process.nextTick(function(){
fibonacciAsync(n-, function(val1){
process.nextTick(function(){
fibonacciAsync(n-, function(val2){
done(val1 + val2);
});
})
});
});
}
}

  

从零开始学习Node.js例子四 多页面实现数学运算的更多相关文章

  1. 从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)

    1.server端 支持数学运算的服务器,服务器的返回结果用json对象表示. math-server.js //通过监听3000端口使其作为Math Wizard的后台程序 var math = r ...

  2. 从零开始学习Node.js例子四 多页面实现数学运算 续一(使用connect和express框架)

    1.使用connect框架 .use方法用于绑定中间件到connect服务器,它会配置一系列在接到请求时调用的中间件模块,此例中我们要配置的中间件有favicon logger static rout ...

  3. 从零开始学习Node.js例子三 图片上传和显示

    index.js var server = require("./server"); var router = require("./router"); var ...

  4. 从零开始学习Node.js例子一 http get和post

    httpserverrequestget.js /* 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数 ...

  5. 从零开始学习Node.js例子八 使用SQLite3和MongoDB

    setup.js:初始化数据库 var util = require('util'); var async = require('async'); //npm install async var no ...

  6. 从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果

    wget.js:发送HTTP客户端请求并显示响应的各种结果 options对象描述了将要发出的请求.data事件在数据到达时被触发,error事件在发生错误时被触发.HTTP请求中的数据格式通过MIM ...

  7. 从零开始学习Node.js例子六 EventEmitter发送和接收事件

    pulser.js /* EventEmitter发送和接收事件 HTTPServer和HTTPClient类,它们都继承自EventEmitter EventEmitter被定义在Node的事件(e ...

  8. 从零开始学习Node.js例子九 设置HTTP头

    server.js //basic server的配置文件 ; var server = require('./basicserver').createServer(); server.useFavI ...

  9. 从零开始学习Node.js例子五 服务器监听

    httpsnifferInvoke.js var http = require('http'); var sniffer = require('./httpsniffer'); var server ...

随机推荐

  1. EntityFramework Core 学习笔记 —— 包含与排除类型

    原文地址:https://docs.efproject.net/en/latest/modeling/included-types.html 在模型类中包含一种类型意味着 EF 拥有了这种类型的元数据 ...

  2. 服务器端查看log的shell脚本

    持续过滤log脚本 服务器端持续查看log的shell脚本(其中path1和path2替换为路径特征名,“tail -f”后面接的路径替换为路径特征名所对应的log文件路径): #! /bin/sh ...

  3. mac攻略(二) -- 简单配置php开发环境

    最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP.   1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...

  4. 我的android学习经历32

    android系统架构 1.Linux内核层(LINUX KERNEL) 这是系统架构的最低层,这层为android设备的硬件提供了驱动 2.系统运行库层(LIBRARIES) 这一层为倒数第二层,利 ...

  5. ubuntu 到底是选择32位还是64位?

     ubuntu 到底是选择32位还是64位? 2011-06-03 15:16:31 标签:ubuntu linux 休闲 cpu 职场 原文出处:官方wiki原文作者:授权许可: 创作共用协议Att ...

  6. 【java】定时器

    总结 1.执行计划的任务放在TimerTask的子类中,由Timer进行该任务. 2.创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束.希望创建的线程为守护线程,则创建 ...

  7. [poj2155]Matrix(二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25004   Accepted: 9261 Descripti ...

  8. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...

  9. poj2280Amphiphilic Carbon Molecules(极角排序)

    链接 卡了几天的破题,对于hdu的那份数据,这就一神题.. 借助极角排序,枚举以每一个点进行极角排序,然后构造两条扫描线,一个上面一个下面,两条同时走,把上线和下线的点以及上线左边的点分别统计出来,如 ...

  10. Asp.Net_网站性能

    1.如果不想被微软包围(其实微软的一套并不贵,是被谣言传高了),数据层依然可以选择SQL Server数据库和存储过程. 2.缓存不再依赖.net自身提供的缓存机制,迁移到部署在Linux平台上的分布 ...