1、使用connect框架
.use方法用于绑定中间件到connect服务器,它会配置一系列在接到请求时调用的中间件模块,此例中我们要配置的中间件有favicon logger static router
app.get/post/put        写法:app.requestName('path', function(req, res, next){});

app-connect.js

 var connect = require('connect');   //npm install connect
connect.createServer()
.use(connect.favicon())
.use(conect.logger())
.use('/filez', connect.static(__dirname + '/filez'))
.use(connect.router(function(app){
app.get('/', require('./home-node').get);
//一个URL字符串和两个函数类型的参数
//路由器配置函数可以包含不限数量的函数,你可以为自己的应用构造一个处理函数的队列
app.get('/square', htutil.loadParams, require('./square-node').get);
app.get('/factorial', htutil.loadParams, require('./factorial-node').get);
app.get('/fibonacci', htutil.loadParams, require('./fibo2-node').get);
app.get('/mult', htutil.loadParams, require('./mult-node').get);
})).listen(); console.log('listening to http://localhost:3000');

2、使用express框架

Express框架是一个基于connect(一个中间件框架)的web应用框架
Express专注于构建一个应用,包括提供一个模板系统;connect专注于做web服务的基础设施

安装Express和EJS(模块处理系统) npm install express ejs

app-express.js

var htutil = require('./htutil');
var math = require('./math');
var express = require('express'); //var app = express.createServer(express.logger()); //express 2.X
var app = express(); //express 3.X //可选,因为Express下默认为CWD/views
app.set('views', __dirname + '/views');
app.engine('.html', require('ejs').__express);
app.set('view engine', 'ejs');
app.configure(function(){
app.use(app.router);
app.use(express.static(__dirname + '/filez'));
//默认的错误处理函数,显示栈轨迹
//如果要显示用户友好的错误,app.err(function(err, req, res, next){
// res.send(error page); //or res.render('template');
// });
app.use(express.errorHandler({
dumpExceptions: true, showStack: true
}));
/*
改成下面的话,浏览器会显示一个简单的消息-Internal Server Error内部服务器错误
app.use(express.errorHandler({
dumpExceptions: true
}));
*/
});
//以上配置了必需的中间件,因为这里展示的配置项对应的是模板系统的配置,所有.html文件会由EJS引擎处理 //以下是路由器配置
app.get('/', function(req, res){
res.render('home.html', {title: "Math Wizard"});
});
app.get('/mult', htutil.loadParams, function(req, res){
if (req.a && req.b) req.result = req.a * req.b;
res.render('mult.html', {title: "Math Wizard", req: req});
});
app.get('/square', htutil.loadParams, function(req, res){
if (req.a) req.result = req.a * req.a;
res.render('square.html', {title: "Math Wizard", req: req});
});
app.get('/fibonacci', htutil.loadParams, function(req, res){
if (req.a){
math.fibonacciAsync(Math.floor(req.a), function(val){
req.result = val;
res.render('fibo.html', {title: "Math Wizard", req: req});
});
}else {
res.render('fibo.html', {title: "Math Wizard", req: req});
}
});
app.get('/factorial', htutil.loadParams, function(req, res){
if (req.a) req.result = math.factorial(req.a);
res.render('factorial.html', {title: "Math Wizard", req: req});
});
app.get('/404', function(req, res){
res.send('NOT FOUND' + req.url);
}); //res.render函数通过一个模板文件渲染数据,EJS只是Express里众多模板引擎中的一个
//配置目的是让EJS能够为views目录下的所有.html文件服务
/*Express里还有其他一些模板引擎
res.render('index.haml', {..data..}); 使用Haml
res.render('index.jade', {..data..}); 使用Jade
res.render('index.ejs', {..data..}); 使用EJS
res.render('index.coffee', {..data..}); 使用CoffeeKup
res.render('index.jqtpl', {..data..}); 使用jQueryTemplates 也可以通过 app.set('view engine', 'haml');
app.set('view engine', 'jade'); 方法来改变默认的渲染引擎 layout.html
默认情况下,模板中用于渲染的内容会被命名为body,然后传递到layout模板中,当app-express.js调用
res.render('fibo.html'...)时,它会先用fibo.html渲染对应的页面片段,然后再使用layout模板渲染整个页面
有两种方法覆盖这一默认的行为
1、在Express里创建一个全局的配置,通过这个全局配置来控制layout模板的启用与禁用
app.set('view options', {layout: false(or true)});
2、覆盖layout模板对应的渲染方式或者使用不同的layout模板
res.render('myview.ejs', {layout: false(or true)});
或者res.render('page', {layout: 'mylayout.jade'}); <% code %> Javascript代码
<%= code %> 显示替换过HTML特殊字符的内容
<%- code %> 显示原始HTML内容
*/ app.listen();
console.log('listening to http://localhost:3000');

html页面放在views目录下

layout.html

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<h1><%=title%></h1>
<table>
<tr>
<td>
<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>
</td>
<td></td>
</tr>
</table>
</body>
</html>

home.html

<% include layout.html %>
<p>Math Wizard</p>

mult.html

<% include layout.html %>
<% if (req.a && req.b){ %>
<p class="result">
<%=req.a%> * <%=req.b%> = <%=req.result%>
</p>
<% } %>
<p>Enter numbers to multiply</p>
<form name="mult" action="/mult" method="get">
A: <input type="text" name="a" /><br/>
B: <input type="text" name="b" />
<input type="submit" name="Submit" />
</form>

还有其他一些页面就不一一列出来了,都大同小异

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

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

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

  2. 从零开始学习Node.js例子四 多页面实现数学运算

    app-node.js ; var http = require('http'); var htutil = require('./htutil'); var server = http.create ...

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

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

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

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

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

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

  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. Android ActionBar的基本用法

    一  说明android 3.0后出现, 在3.0之前称为Title Bar  显示位置在标题栏上可以显示应用程序的图标和activity的标题创建方式的和系统菜单相似, 区别在于: android: ...

  2. CentOS7网卡的命名规则

    一.前两个字符的含义 en 以太网 Ethernet wl 无线局域网 WLAN ww 无线广域网 WWAN 二.第三个字符的含义 o on-board device index number s h ...

  3. 20个Linux服务器安全强化建议(二)

    接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略.   当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...

  4. 原生cookie

    出于浏览器的安全性限制,从WEB应用程序中访问用户本地文件系统是有许多限制的.但是WEB站点的开发人员可以使用cookie,将少量信息保存在用户本地硬盘的指定空间中. document对象的cooki ...

  5. python 中的input

    渣渣之路. 一. 在python编程初学者指南中的第六章.使用参数和返回值的例子中: # -*- coding: utf-8 -*- def display(message): print messa ...

  6. zabbix3.0.4 部署之八 (zabbix3.0.4 微信报警)

    [root@sv-zabbix ~]# cat /usr/local/zabbix/share/zabbix/alertscripts/weixin.py #!/usr/bin/env python# ...

  7. zabbix3.0.4 部署之一 (简介)

    官方网站:http://www.zabbix.com/ 下载地址:http://www.zabbix.com/download.php zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视 ...

  8. Request获取URL地址相应方法

    以项目为BBS为例,以下代码置于modify.jsp: 1.request.getLocalName(): akiradunn 2.request.getServerName(): localhost ...

  9. VB6.0对鼠标滚轮不支持的解决方法[转]已经测试work

    今天要修改一个老DLL文件,安装了vb6,用起来很不爽. VB6编辑器 和 VBA编辑器 (Office 中的VB编辑器)都不支持鼠标滚动. 但 MS 已经提供了补丁http://download.m ...

  10. HR函数学习01——创建组织单位

    创建组织单位: RH_OBJECT_CREATE REPORT ZLYHR01. DATA:LS_OBJ TYPE OBJEC, LV_STU TYPE GDSTR-SVECT, LV_TIT TYP ...