从零开始学习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 相关文章推荐
Mootools 1.2教程 函数
Sep 15 Javascript
jQuery中document与window以及load与ready 区别详解
Dec 29 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
详解在Javascript中进行面向切面编程
Apr 28 Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 Javascript
js基于canvas实现时钟组件
Feb 07 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
PHP6 先修班 JSON实例代码
2008/08/23 PHP
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
thinkPHP查询方式小结
2016/01/09 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Pandas统计重复的列里面的值方法
2019/01/30 Python
Python for循环与range函数的使用详解
2019/03/23 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
机电一体化职业规划书
2014/01/07 职场文书
《春笋》教学反思
2014/04/15 职场文书
Python实现简繁体转换
2021/06/07 Python
Mysql事务索引知识汇总
2022/03/17 MySQL