从零开始学习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 相关文章推荐
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
Apr 15 Javascript
js 可拖动列表实现代码
Dec 13 Javascript
jQuery提交多个表单的小例子
Jun 30 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
js文本框走动跑马灯效果代码分享
Aug 25 Javascript
关于JS中prototype的理解
Sep 07 Javascript
jQuery无刷新分页完整实例代码
Oct 27 Javascript
jQuery实现的分子运动小球碰撞效果
Jan 27 Javascript
对vue里函数的调用顺序介绍
Mar 17 Javascript
Vue render深入开发讲解
Apr 13 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 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学习之PHP表达式
2006/10/09 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php判断当前操作系统类型
2015/10/28 PHP
input 高级限制级用法
2009/03/26 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
如何使用amaze ui的分页样式封装一个通用的JS分页控件
2020/08/21 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
公立医院改革实施方案
2014/03/14 职场文书
确保工程质量承诺书
2015/04/29 职场文书
民事调解书范文
2015/05/20 职场文书
小学家长意见怎么写
2015/06/03 职场文书
会议营销主持词
2015/07/03 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技