从零开始学习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触发器详解
Mar 10 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
Aug 04 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
Aug 27 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
JavaScript中property和attribute的区别详细介绍
Mar 03 Javascript
JavaScript代码判断点击第几个按钮
Dec 13 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
vue获取当前激活路由的方法
Mar 17 Javascript
使用Vue动态生成form表单的实例代码
Apr 26 Javascript
简述JS控制台的使用
Jul 15 Javascript
vue实现信息管理系统
May 30 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中操作ini配置文件的方法
2013/04/25 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
Python中的tuple元组详细介绍
2015/02/02 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
python入门之井字棋小游戏
2020/03/05 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
工厂门卫岗位职责范本
2014/04/04 职场文书
离职保密承诺书
2014/05/28 职场文书
设备管理实施方案
2014/05/31 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL