本文实例讲述了Node Express用法。分享给大家供大家参考,具体如下:
安装
npm install --save express
基本使用
//引用express var express = require('express'); //创建app var app = express(); //罗列中间件 app.get('/',function( req,res ){ res.send('index'); }); app.get('/new/:id',function( req,res ){ res.send('news'+ res.params.id); }); //开启服务器,监听端口 app.listen(3000);
路由
express 路由
//路由小写和大写都可以。 var express = require('express'); var app = express(); app.get('/',function( req,res ) { res.send('get请求'); }); app.post('/',function( req,res ){ res.send('post请求'); }); app.listen(1221);
get和post请求都可以
app.all('/',function( req,res ){ res.send('get&post'); }); // 更推荐冒号写法 app.get('/student/:id',function( req,res ){}); app.get('/:username/:id',function( req,res ){ res.write(username); res.end(id) });
有字符串正则系统
// 匹配 acd 和 abcd app.get('/ab"htmlcode">// 匹配任何路径中含有 a 的路径: app.get(/a/, function(req, res) { res.send('/a/'); }); // 路由中的正则表达式,可以使用分组捕获,程序中使用req.params[0],req.params[1]来获取 app.get(/student([\d]{1})\/class([\d]{2})$/,function( req,res ){ console.log( req.params[0],req.params[1] ); });表单提交
表单提交到本身页面 // restful 路由设计
/* 概念: /student get // 读取学生信息 // app.get('/student/:id',function(){}); add // 添加学生信息 // app.add('/student/:id',function(){}); delete // 删除学生信息 // app.delete('/student/:id',function(){}); 问题:web网页中,大部分处理get和psot请求处理。 其它的服务,可以是从软件,或者app发出请求。一般restful是提供给app。 */ app.get('/',function( req,res ){ res.render('form.ejs'); }); app.post('/',function( req,res ){ res.send('form表单提交'); });中间件
中间件
middleware
,少了一层回调。
所有的中间件,都将作为http.createServer();
的回调。中间件特点:
app.js中的代码,程序执行的时候运行,用户来了之后,并不执行。中间件中的代码块,每个用户访问的时候都会执行一次。
具有跳楼现象,从上往下走,匹配一个就执行,而不会执行第二个。
app.get('/',function( req,res ){ res.send('A') }); app.get('/',function( req,res ){ res.send('B') }); //执行A,而不会执行B中间件的回调函数中有next参数,表示继续执行下一个匹配的中间件。 //利用next(),用两段小程序,来同时处理同一个请求。 把业务分开。 next() , 影响MVC。
app.get('/',function( req,res,next ){ res.send( 'A' ); next(); }) app.get('/',function( req,res,next ){ res.send( 'B' ); }) //这两个路由,感觉没关系,实际上冲突了。 app.get('/:username/:id',function( req,res ){ console.log(1); res.send('用户信息'+ req.params[username]); }); app.get('/admin/login',function( req,res ){ console.log(2); res.send('管理员登陆'); });解决方法
方法1:
调整路由上下位置 //利用匹配就有跳楼现象。 express 中 所有的路由 都是中间件,具体的路由往上写,抽象的往下写。app.get('/admin/login',function( req,res ){ console.log(2); res.send('管理员登陆'); }); app.get('/:username/:id',function( req,res ){ console.log(1); res.send('用户信息'+ req.params[username]); });方法2: 匹配到最后,要有最终的路由来匹配于它。
//加上next()之后,匹配两次,已经被send()一次,会报错。通过数据的判断适当加next() app.get('/:username/:id',function( req,res ){ var username = req.paramse.username; //检索数据库,如果username不存在,那么才next() if( usernma ) { console.log(1); res.send('用户信息'+ req.params[username]); } else { next(); } }); app.get('/admin/login',function( req,res ){ console.log(2); res.send('管理员登陆'); });app.use()
此时并不会进行任何路由匹配,都是执行。一般处理404,和总体的返回编码和状态的使用。
// 多个路由都能够匹配 app.use('/admin',function( req,res ){ console.log(req.originUrl); // '/admin/new' console.log(req.baseUrl); // 'admin' console.log(req.path); // '/new' next(); }); // 任何网址都是 '/' 的拓展 app.use('/',function( req,res ){}); app.use(function( req,res ){}); // 可以不用第一个参数 直接就是 '/',就是所有网址了。 app.use(); //增加一些特定功能的便利场所。 // 实际上app.use(); //基本上都从第三方能得到。 -- 路由顺序(落路) app.use(user); function user( req,res,next ){ var filePath = req.originalUrl; fs.readFile('./public/'+filePath,function( err,data ){ if( err ){ //文件不存在 next() return ; } res.send(data.toSting()); }); } // 静态服务 app.use(express.static('./public')); // 路由的上下关系,很有关系, 是否匹配第一个,是否需要next() // 一般习惯把静态服务写在前头,后面的路由处理,一般不冲突。 // 返回编码和状态 app.use(function( req,res,next ){ res.status(200); res.set('Content-Type','text/html;charset=utf-8'); next(); }); //404 app.use(function( req,res ){ res.status(404); res.send('sorry'); });render() & send()
大多数情况下,渲染内容用
res.render()
,将会根据views的模板文件进行渲染,如果不想使用views文件夹,使用其它名字,app.set('views','static');
send(); //自动设置了Content-Type 头部和200状态码。和 mime类型。 send() 和 end() 一样。get & post
get请求的参数在url中,在原生node中,需要使用url模块来识别参数字符串,在express中,不需要使用url模块。可以直接使用
req.query
对象。post请求在express中不能直接获得,必须使用
body-parser
模块。使用后,将可用req.body
得到参数。但是如果表单中含有文件上传,那么还是需要使用formidable模块
。post使用到的第三方模块:
body-parser
,formidable
var express = require('express'); var bodyParser = require('body-parser'); var app = express(); // 设置模板 app.set('view engine','ejs'); app.use(bodyParser.urlencoded({ extended: false })); // router app.get('/',function( req,res ){ res.render('form.ejs'); }); app.post('/',function( req,res ){ console.log(req.body); });静态化文件
利用
expres.static(root);
// root 参数指的是静态资源文件所在的根目录。// app.use方法实际上是将中间件保存在一个数组中,注册路由时,依次将数组的元素取出 app.use(express.static('./static')); app.use('page',epxress.static('./static')); // page/index.html模板引擎
和 express 结合的模板是:
jade
,ejs
(ejs)[https://www.npmjs.com/package/ejs%5Dvar express = require('express'); var app = express(); // 设置模板引擎,设置为ejs app.set('view engine','ejs'); // 路由 app.get('/',function( req,res ){ //render: 第二个参数是,字典。 res.render('index.ejs',{ 'name': [ting,daie] }); }); app.listen(1221);对应的模板为:
<ul> <% for( var i=0; i<name.length; i++ ){ %> <li><%=name[i]%></li> <% } %> </ul>默认的视图文件夹,
views
。如果不想使用默认的app.set('views','./shitu');
希望本文所述对大家node.js程序设计有所帮助。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】