|
3 r r' X) Z9 I8 b1 e 项目整体预览 # A: v! i2 c4 S7 X" N8 M! K
项目的github地址界面逼格还行-_-主要功能:登陆;退出;所用的主要模块:express, 路由.静态文件.模块分工等;express-session, 采用session的方式解决http无状态; 9 u' ?7 N7 u: ]' H, @
body-parse: 解析body;ejs模板引擎;path模块;配置使用: 直接下载, 运行即可,配置详看: package.json;
7 Q/ h" o8 h) J; J1 s 项目讲解过程1.初始化package.json; 2.下载express npm install express --save 3.app.js 中var express = require(express);var routes = require(./routes/index);var app = express();app.use(/, routes);app.use(/login,routes); app.listen(3000); 9 M. P/ n+ T# E+ o9 L, `
4.创建index.jsvar express = require(express);var router = express.Router();/* GET index page. */router.get(/, function(req, res,next) { res.send(hello 51code)});router.get(/login, function (request, response) { res.send(hello 51code)});//导出接口module.exports = router; ' b+ e8 [( ~& M+ p# U/ j7 b ]
5.截取404错误;app.js// // 捕获404错误app.use(function(req, res, next) { var err = new Error(Not Found); err.status = 404; //现在是打印全部信息 next(err);}); $ ]. n, T) p6 ^9 {" I
5.创建HTML文件, Login , X+ W2 H5 v% }8 H$ ]: }- B
6.加载HTML文件, express框架中有专门处理静态文件的方法--static,既然是存在关于路径相关的内容, 就需要下载npm install path --savenpm install ejs --save
1 L# \1 f( l1 p8 Q8 p c 为了提供诸如图像、CSS 文件和 JavaScript 文件之类的静态文件,可以使用 Express 中的 express.static 内置中间件函数 将包含静态资源的目录的名称传递给 express.static 中间件函数,以便开始直接提供这些文件。 ( ^( e# E1 v& p, g* ?& o. p
例如,使用以下代码在名为 public 的目录中提供图像、CSS 文件和 JavaScript 文件:var path = require(path);//// 设置views文件夹为存放视图文件的目录,//__dirname为全局变量,存放当前正在执行的脚本所在的目录app.set(views, path.join(__dirname, views));//注册ejs模板为html页。
* c- V; d' H/ z 简单的讲,就是原来以.ejs为后缀的模板页,现在的后缀名可以//是.html了app.engine("html",require("ejs").__express); //app.engine("html",require("ejs").renderFile);//app.set("view engine","ejs");//设置视图模板的默认后缀名为.html,避免了每次res.Render("xx.html")的尴尬以及加载的是html.jade(因为jade是默认的引擎)app.set(view engine, html);。 - G5 D9 ~/ C/ R% z V
Express默认使用jade模板如果要使用其他模板引擎,如:将EJS模板映射至".html"文件:实际调用了EJS的.renderFile()方法,ejs.__express是该方法在EJS内部的另一个名字。 ) t9 L0 b2 V( E) H5 r
因为加载的模板引擎后调用的是同一个方法.__express,所以如果使用的是ejs模板,不用配置该项总结:使用html模板,需增加 app.engine(html, require(ejs).__express);。 4 _; @1 L0 Q5 O' V1 n
使用EJS模板,不用配置该项 app.set(name, value); 在.set()方法的参数中,有一项是view engine,表示没有指定文件模板格式时,默认使用的引擎插件(.jade)。
5 X8 S3 v1 i E0 r7 |+ B , 所以需要app.set(view engine, html);渲染页面router.get(/login, function (request, response) { response.render("index",{title:User Login});}); / F6 ?/ P, F/ h/ L" @5 b
index.js 添加方法 /postrouter.post(/login, function (req, resp) { //取session, 如果没有, 证明没有登录 var session = req.session; console.log(+++++++ + req.body.username + req.session.uniqueId); });
( I9 \& @/ g5 Q# i7 B 更改HTML代码//post 访问/login 8 y; W* ~$ j& ?0 G
此时可以访问/post方法, 但是读取body内容, 需要body-parse 模块$ npm install body-parser --save试想一个内容, 我们如果登陆过后, 关闭浏览器, 在此打开是否认得我们是网站用户, 那么面临的就是http无状态问题, 我们有两种方法解决, cookie与session, 在这里我们采用session的方法解决 . F7 y0 Q& N1 _6 k$ @$ X
$ npm install express-session --save接下来开始配置//引用body-parsevar bodyParser = require(body-parser);//引用express-session模块var session = require(express-session);//解析数据 常用的两种格式app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: true}));//session 相关app.use(session({ secret: asdfoii9838u923$%^&*(, cookie:{ maxAge: 1000 * 60 }, //每次访问都重新更新 resave: true, //强制“未初始化”的会话保存到存储。
! B; f: y T* ~' H saveUninitialized: true, }));http 重定向问题 :router.post(/login, function (req, resp) { //取session, 如果没有, 证明没有登录 var session = req.session; console.log(+++++++ + req.body.username + req.session.uniqueId); if(session.uniqueId){ resp.redirect(/redirects); }else{ // 存储uniqueid session.uniqueId = req.body.username; resp.redirect(/redirects); }});//专门处理更改路径的问题 (重定向)router.get(/redirects, function(req, res){ res.send(aaaa);}); ( U1 u1 _% i# g$ y8 J& S' w" p
在Web应用中,有时会遇到页面需要 Url重定向的情况Url重定向分为 301、 302两种 301、302都是HTTP状态的编码,都代表着某个Url发生了转移1. 301重定向是永久的重定向(Moved Permanently),表示本网页永久性转移到另一个地址,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。 , n. a2 Y& x, D& {( T3 Z2 n8 g
2. 302重定向是临时的重定向(Moved Temporarily),表示本网页暂时性转移到另一个地址,搜索引擎会抓取新的内容而保留旧的网址Express是一个基于Node.js实现的Web框架,其响应HTTP请求的response对象中有两个用于URL跳转方法 8 o: C- Y W% h9 t: s( c2 N
res.location()和 res.redirect(),使用它们可以实现URL的 301或302重定向要更改cookie时间 1000 * 60 代表一分钟router.get(/redirects, function(req, res) { // res.send(我是操作重定向的方法); //类似中间变量, 将session传至该方法 // req.session;全局变量 var session = req.session; console.log(-99999--- + session.uniqueId); //如果登陆成功,跳转到首页 if(session.uniqueId == admin){ res.redirect(/home); }else{ res.send(req.session.uniqueId + not found ! Logout ); }})//首页router.get(/home, function (req, res) { var session = req.session; console.log(------9--- + session.uniqueId); if(session.uniqueId != admin){ res.send(Unauthorized Login again ); }else{ //展示Home页面 res.render(home); //resp.send(Welcome admin Logout ); }});。
/ p6 @6 R' o+ A$ @5 N9 a. x 退出登陆//退出方法router.get(/logout, function (req, resp) { // 删除session req.session.destroy(); // 重定向至login resp.redirect(/login);}); ) H; o1 a* F9 s' l( O+ J
// // 捕获404错误app.use(function(req, res, next) { var err = new Error(Not Found); err.status = 404; next(err);}); : t" C. [7 q$ R& ]
更多精彩内容请关注“IT实战联盟”哦~~~
- R3 f3 D+ l# ?9 T6 _9 }* q+ h Z: m9 o* Q: M0 i" i
5 o& s; e8 `$ V/ t+ V2 W* T+ Z5 r# F
- {/ o5 `" h( S/ P n |