从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例


Posted in Javascript onApril 13, 2017

本文实例讲述了Node.js基于connect和express框架的多页面实现数学运算。分享给大家供大家参考,具体如下:

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(3000);
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(3000);
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="/" rel="external nofollow" >home</a></p>
          <p><a href="/mult" rel="external nofollow" >Multiplication</a></p>
          <p><a href="/square" rel="external nofollow" >Square</a></p>
          <p><a href="/factorial" rel="external nofollow" >Factorial</a></p>
          <p><a href="/fibonacci" rel="external nofollow" >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>

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

希望本文所述对大家nodejs程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 布尔操作符解析  &amp;&amp; || !
Aug 10 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
Jul 21 Javascript
jquery ui dialog替代confirm实例分析
Jan 25 Javascript
Active控件问题小结(附解决办法)
Jun 09 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
Bootstrap源码解读导航条(7)
Dec 23 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
Sep 25 Javascript
记一次vue跨域的解决
Oct 21 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 #Javascript
MUI  Scroll插件的使用详解
Apr 13 #Javascript
MUI 上拉刷新/下拉加载功能实例代码
Apr 13 #Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
Apr 13 #Javascript
mui上拉加载功能实例详解
Apr 13 #Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 #Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 #Javascript
You might like
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
测试你的JS的掌握程度的代码
2009/12/09 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
毕业生大学生活自我总结
2014/01/31 职场文书
《画家乡》教学反思
2014/04/22 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
客户答谢会致辞
2015/01/20 职场文书
python中pymysql包操作数据库方法
2022/04/19 Python