GVKun编程网logo

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

10

以上就是给各位分享从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例,同时本文还将给你拓展express.js4.0的路由学习以及node.js实现ex

以上就是给各位分享从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例,同时本文还将给你拓展express.js4.0的路由学习以及node.js实现express框架的app.use、app.get、app.post的区别、Express框架之connect-flash详解、Node.js Express express.json和express.urlencoded表单提交、Node.js Express express.json和express.urlencode使用表单提交等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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

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

本文实例讲述了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

rush: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',require('./factorial-node').get); app.get('/fibonacci',require('./fibo2-node').get); app.get('/mult',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

rush: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,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('/',res){ res.render('home.html',{title: "Math Wizard"}); }); app.get('/mult',res){ if (req.a && req.b) req.result = req.a * req.b; res.render('mult.html',{title: "Math Wizard",req: req}); }); app.get('/square',res){ if (req.a) req.result = req.a * req.a; res.render('square.html',req: req}); }); app.get('/fibonacci',res){ if (req.a){ math.fibonacciAsync(Math.floor(req.a),function(val){ req.result = val; res.render('fibo.html',req: req}); }); }else { res.render('fibo.html',req: req}); } }); app.get('/factorial',res){ if (req.a) req.result = math.factorial(req.a); res.render('factorial.html',req: req}); }); app.get('/404',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

rush:xhtml;">

<%=title%>

home

Multiplication

Square

Factorial

Fibonacci

express.js4.0的路由学习以及node.js实现express框架的app.use、app.get、app.post的区别

express.js4.0的路由学习以及node.js实现express框架的app.use、app.get、app.post的区别

//express.js的路由Router学习

Router是express4.0新加入的功能,它就像是一个迷你的应用程式,可以让应用程式内部的路由编写更方便、更有弹性。

 

 

//app.get与app.use区别

app对象一般用来表示express程序,通过调用express模块导出的顶层express()方法来创建。

区别:

app.use(path,callback)中的callback既可以是router对象,也可以是函数。

app.get/post(path,callback)中的callback只能是函数。

理解:

将app.get()看作是app.use的特定请求(get)的简要写法,例子如下:

var express = require("express");

var app =express;

app.get("/hello",(req,res)=>{

    res.send("hello ");

               })

与下面等同

var express = require("express");

var app = express();

var router = express.Router();

router.get("/",(req,res=>{

res.send(“hello”)

}))  //一般将此部分单独放在routers文件夹中

app.use("/hello",router)

也即:路由规则是app.use(path,router)定义的,router代表一个由express.Router创建的对象,在路由对象中可以定义多个路由规则。

当我们的路由只有一条规则时,可直接接一个回调函数用app.get简写;当一个路径有多个匹配规则时,使用app.use(path,router),router放在一个单独的文件里面配置多个规则。

 

Express框架之connect-flash详解

Express框架之connect-flash详解

第一步:我们首先来看看这个插件的使用

rush:js;"> var flash = require('connect-flash'); app.use(flash());//Express使用这个插件

第二步:我们看看其内部是如何实现的

rush:js;"> var format = require('util').format; var isArray = require('util').isArray;

依赖的模块为node.js的核心模块util

rush:js;"> module.exports = function flash(options) { options = options || {}; //如果用户没有指定unsafe参数,那么safe就是true;否则如果用户指定了unsafe为false那么safe就是true //也就是说这个插件只能指定一个配置项就是unsafe,默认不指定为就是安全的! var safe = (options.unsafe === undefined) ? true : !options.unsafe; return function(req,res,next) { //如果req.flash存在,同时是safe的那么直接调用下面一个插件,这个插件就不执行了 if (req.flash && safe) { return next(); } //如果上面的条件不满足那么为req指定flash属性,其值为下面的_flash函数 req.flash = _flash; next(); } }

很显然,我们看到可以传入options参数,如果没有指定unsafe那么unsafe就是true,此时safe就是false。如果用户明确指定了unsafe为false那么safe为true,如果明确指定了unsafe为false那么safe就是true。如果safe为true那么直接调用下面一个中间件。

我们现在看看req对象的flash方法是怎么样的:

2 && format) { var args = Array.prototype.slice.call(arguments,1); //获取第二个参数以后的数组 msg = format.apply(undefined,args); //msg保存的是第二个参数以后的值,并对这个值进行了format处理 } else if (isArray(msg)) { msg.forEach(function(val){ (msgs[type] = msgs[type] || []).push(val); }); return msgs[type].length; //如果传入的第二个参数是一个数组,那么全部把数据绑定到req.session.flash域里面,其中数据类型为{'info':['school','home']} //然后返回的是特定的长度 } //如果参数不多于2,同时msg也不是数组,那么把msg添加到req.session.flash中然后返回 return (msgs[type] = msgs[type] || []).push(msg); } else if (type) { //如果没有指定msg,仅仅指定了type,这时候我们获取到req.session.flash中特定类型的数据,同时把数据从req.session.flash中删除 var arr = msgs[type]; delete msgs[type]; return arr || []; } else { //如果调用方式如flash()也就是不传入任何参数,这时候直接清空了req.session.flash中的数据 this.session.flash = {}; return msgs; } }

(1)如果传入的参数多于两个,那么首先获取第二个以及以后的参数,然后对第二个以后的参数进行format操作,最后把数据封装到req.session.flash中,同时返回。

rush:js;"> req.flash('info','email has been sent to %s.',userName);

(2)如果传入的第二个参数是一个数组,那么把这个数组每一个元素封装到req.session.flash中,然后返回特定type的数据的长度

(3)否则如果仅仅传入了type表示获取指定类型的数据然后返回,并把数据从req.session.flash中删除(这样只要我们调用这个方法获取了数据那么就从session中删除了)

['email sent','email re-sent'] req.flash('info'); // => []这时候info已经清空了

(4)如果用户没有传入任何参数那么清空req.session.flash域,但是返回的是原来的局部变量保存到的req.session.flash对象

rush:js;"> else { //如果调用方式如flash()也就是不传入任何参数,这时候直接清空了req.session.flash中的数据 this.session.flash = {}; return msgs; }

这个插件一般和redirect一起使用,保证在渲染下一个页面的时候数据可用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

Node.js Express express.json和express.urlencoded表单提交

Node.js Express express.json和express.urlencoded表单提交

Express(或Connect的)bodyParser中间件被标记为不建议使用,建议用户改为:

app.use(connect.urlencoded())
app.use(connect.json())

但是,当我在Action中运行Node.js的一个例子时,我使用curl来填写本书中建议的表单:

curl -F entry[title]='Ho ho ho' -F entry[body]='santa loves you' http://abc:123@127.0.0.1:3000/api/entry

它不工作req.body没有定义。我错过了什么吗?它适用于bodyParser。

编辑:解决方案从Express 4

这样解析json:

var bodyParser = require('body-parser');

...

app.use(bodyParser.json());

以这种方式解码urlencoded body:

app.use(bodyParser.urlencoded({extended: true}));

然后没有废弃警告。 extended:true(默认)使用qs模块,false使用querystring模块来解析主体。

不要使用app.use(bodyParser()),该用法现在已被弃用。

解决方法

bodyParser其实是三个中间件的组成(见 documentation和 relevant source code):json,urlencoded和multipart:

> json解析application / json请求体
> urlencoded解析x-ww-form-urlencoded请求体
>和multipart解析multipart / form-data请求主体,这是您感兴趣的。

如果只指定json和urlencoded的中间件,表单数据将不会被任何中间件解析,因此req.body不会被定义。然后,您需要添加一个能够解析形式数据的中间件,例如强大的,忙碌的或多方的(如connect‘s documentation所述)。

这是一个例子,使用multiparty

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.use('/url/that/accepts/form-data',multipartMiddleware);
app.post('/url/that/accepts/form-data',function(req,resp) {
    console.log(req.body,req.files);
});

不要忘记,通过使用这样的中间件,您允许任何人将文件上传到您的服务器:然后您有责任处理(并删除)这些文件。

Node.js Express express.json和express.urlencode使用表单提交

Node.js Express express.json和express.urlencode使用表单提交

Express(或Connect的)bodyParser中间件已标记为已弃用,建议用户改为使用:

app.use(connect.urlencoded())
app.use(connect.json())

但是,当我从 Action中的Node.js 运行示例时,我使用curl来按照书中的建议填写表格:

curl -F entry[title]='Ho ho ho' -F entry[body]='santa loves you' http://abc:123@127.0.0.1:3000/api/entry

没用 req.body没有定义。我想念什么吗?它与bodyParser一起正常工作。

编辑:自Express 4起的解决方案

以这种方式解析json:

var bodyParser = require('body-parser');

...

app.use(bodyParser.json());

通过以下方式解析urlencoded主体:

app.use(bodyParser.urlencoded({extended: true}));

则没有弃用警告。扩展名:true(默认)使用qs模块,false使用querystring模块来解析正文。

请勿使用app.use(bodyParser()),该用法现已弃用。

今天的关于从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例的分享已经结束,谢谢您的关注,如果想了解更多关于express.js4.0的路由学习以及node.js实现express框架的app.use、app.get、app.post的区别、Express框架之connect-flash详解、Node.js Express express.json和express.urlencoded表单提交、Node.js Express express.json和express.urlencode使用表单提交的相关知识,请在本站进行查询。

本文标签: