/*** 模块依赖*/var express = require("express"), routes = require("./routes"), user = require("./routes/user"), http = require("http"), path = require("path");var app = express();//环境变量app.set("port", process.env.PORT || 3000);app.set("views", __dirname + "/views");app.set("view engine", "ejs");app.use(express.favicon());app.use(express.logger("dev"));app.use(express.bodyParser());app.use(express.methodOverride());app.use(app.router);app.use(express.static(path.join(__dirname, "public")));// 开发模式if ("development" == app.get("env")) {app.use(express.errorHandler());}// 路径解析app.get("/", routes.index);app.get("/users", user.list);// 启动及端口http.createServer(app).listen(app.get("port"), function(){console.log("Express server listening on port " + app.get("port"));});4. Ejs模板使用<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><title><%=: title %></title><!-- Bootstrap --><link href="http://www.geedoo.info/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen"><!-- <link href="http://www.geedoo.info/css/bootstrap-responsive.min.css" rel="stylesheet" media="screen"> --></head><body screen_capture_injected="true">index.html<% include header.html %><h1><%= title %></h1><p>Welcome to <%= title %></p><% include footer.html %>footer.html<script src="http://www.geedoo.info/javascripts/jquery-1.9.1.min.js"></script><script src="http://www.geedoo.info/javascripts/bootstrap.min.js"></script></body></html>访问localhost:3000正确。
app.get("/",routes.index);app.route("/login").get(routes.login)post(routes.doLogin);app.get("/logout",routes.logout);app.get("/home",routes.home);注:get为get请求,post为post请求,all为所有针对这个路径的请求
exports.index=function(req, res) { res.render("index", { title: "index" });};exports.login=function(req,res){ res.render("login",{title: "用户登录"});};exports.doLogin=function(req,res){ var user = { username:"admin", password:"admin"}if(req.body.username==user.username && req.body.password==user.password){ res.redirect("/home");}res.redirect("/login");};exports.logout = function(req,res){ res.redirect("/");};exports.home = function(req,res){ var user = { username:"admin", password:"admin" } res.render("home",{title:"Home",user:user});};创建views/login.html和views/home.html两个文件<% include header.html %> <div class="container-fluid"><form class="form-horizontal" method="post"><fieldset><legend>用户登陆</legend><div class="control-group"><label class="control-label" for="username">用户名</label><div class="controls"><input type="text" class="input-xlarge" id="username" name="username"></div></div><div class="control-group"><label class="control-label" for="password">密码</label><div class="controls"><input type="password" class="input-xlarge" id="password" name="password"></div></div><div class="form-actions"><button type="submit" class="btn btn-primary">登陆</button></div></fieldset></form></div><% include footer.html %>home.html:<% include header.html %><h1>Welcome <%= user.username %>, 欢迎登陆!!</h1><a claa="btn" href="http://www.geedoo.info/logout">退出</a><% include footer.html %>修改index.html,增加登陆链接
<% include header.html %><h1>Welcome to <%= title %></h1><p><a href="http://www.geedoo.info/login">登陆</a></p><% include footer.html %>路由及页面我们都写好了,快去网站上试试吧。
var session = require("express-session");var connect = require("connect");var SessionStore = require("session-mongoose")(connect);var store = new SessionStore({url:"mongodb://localhost/session", interval: 120000});app.use(session({ secret: "test.com", store: store, cookie:{maxAge:10000} //expire session in 10 seconds}));//用于把登录用户设置到res.locals里面,在home.html里显示app.use(function(req,res,next){ res.locals.user = req.session.user; console.log("Session is = ",req.session.user); next();});需要添加中间件connect、session-mongoose。exports.doLogin = function(req, res){ var user={ username:"admin", password:"admin" }if(req.body.username===user.username && req.body.password===user.password){ req.session.user=user; return res.redirect("/home"); } else { return res.redirect("/login");}};exports.logout方法exports.logout = function(req, res){ req.session.user=null; res.redirect("/");};exports.home方法exports.home = function(req, res){ res.render("home", { title: "Home"});};这个时候session已经起作用了,exports.home的user显示传值已经被去掉了。 是通过app.js中app.use的res.locals变量,通过框架进行的赋值。app.use(function(req, res, next){ res.locals.user = req.session.user; next();});注:这个session是express4.10.4的写法,与express4之前的版本是不一样的。
nodejs-mongodb
nodejs-mongodb
由于上面配置的 cookie:{maxAge:10000} //expire session in 10 seconds
过期时间,因此你会看到mongodb里面的数据过一段时间就被清除了。
参考:
Mongoose:http://mongoosejs.com/
关于express4.2.0与express3.x操作的区别:http://blog.csdn.net/u013758116/article/details/38758351
8. 页面提示
登陆的大体我们都已经讲完了,最后看一下登陆失败的情况。
我们希望如果用户登陆时,用户名或者密码出错了,会给用户提示,应该如何去实现。
打开app.js的,增加res.locals.message
登陆的大体我们都已经讲完了,最后看一下登陆失败的情况。
我们希望如果用户登陆时,用户名或者密码出错了,会给用户提示,应该如何去实现。
打开app.js的,增加res.locals.message
app.use(function(req, res, next){ res.locals.user = req.session.user; var err = req.session.error; delete req.session.error; res.locals.message = ""; if (err) res.locals.message = "<div class="alert alert-danger">" + err + "</div>"; next();});修改login.html页面,<%- message %><% include header.html %><div class="container-fluid"><form class="form-horizontal" method="post"><fieldset><legend>用户登陆</legend><%- message %><div class="control-group"><label class="control-label" for="username">用户名</label><div class="controls"><input type="text" class="input-xlarge" id="username" name="username" value="admin"></div></div><div class="control-group"><label class="control-label" for="password">密码</label><div class="controls"><input type="password" class="input-xlarge" id="password" name="password" value="admin"></div></div><div class="form-actions"><button type="submit" class="btn btn-primary">登陆</button></div></fieldset></form></div><% include footer.html %>修改routes/index.js,增加req.session.error
exports.doLogin = function(req, res){ var user={ username:"admin", password:"admin" } if(req.body.username===user.username && req.body.password===user.password){ req.session.user=user; return res.redirect("/home"); } else { req.session.error="用户名或密码不正确"; return res.redirect("/login"); }};让我们来看看效果: http://localhost:3000/login 输入错误的和密码, 用户名:dad,密码:da
9. 页面访问控制
网站登陆部分按照我们的求已经完成了,但网站并不安全。
localhost:3000/home,页面本来是登陆以后才访问的,现在我们不要登陆,直接在浏览器输入也可访问。
页面报错了,提示<%= user.username %> 变量出错。
GET /home?user==a 500 15ms
TypeError: D:workspaceproject
odejs-demoviewshome.html:2
1| <% include header.html %>
>> 2| <h1>Welcome <%= user.username %>, 欢迎登陆!!</h1>
3| <a claa="btn" href="http://www.geedoo.info/logout">退出</a>
4| <% include header.html %>
Cannot read property "username" of null
at eval (eval at <anonymous> (D:workspaceproject
odejs-demo
ode_modulesejslibejs.js:
at eval (eval at <anonymous> (D:workspaceproject
odejs-demo
ode_modulesejslibejs.js:
at D:workspaceproject
odejs-demo
ode_modulesejslibejs.js:249:15
at Object.exports.render (D:workspaceproject
odejs-demo
ode_modulesejslibejs.js:287:
at View.exports.renderFile [as engine] (D:workspaceproject
odejs-demo
ode_modulesejsl
at View.render (D:workspaceproject
odejs-demo
ode_modulesexpresslibview.js:75:8)
at Function.app.render (D:workspaceproject
odejs-demo
ode_modulesexpresslibapplicati
at ServerResponse.res.render (D:workspaceproject
odejs-demo
ode_modulesexpresslib
es
at exports.home (D:workspaceproject
odejs-demo
outesindex.js:36:8)
at callbacks (D:workspaceproject
odejs-demo
ode_modulesexpresslib
outerindex.js:161
这个页面被打开发,因为没有user.username参数。我们避免这样的错误发生。
还记录路由部分里说的get,post,all的作用吗?我现在要回到路由配置中,再做点事情。
修改app.js文件
app.get("/",routes.index);
app.route("/login")
.all(notAuthentication)
.get(routes.login)
.post(routes.doLogin);
app.route("/logout")
app.get("/",routes.index);
app.route("/login")
.all(notAuthentication)
.get(routes.login)
.post(routes.doLogin);
app.route("/logout")
.get(authentication)
.get(routes.logout);
app.route("/home")
.get(authentication)
.get(routes.home);
访问控制:
/ ,谁访问都行,没有任何控制
/login,用all拦截所有访问/login的请求,先调用authentication,用户登陆检查
/logout,用get拦截访问/login的请求,先调用notAuthentication,用户不登陆检查
/home,用get拦截访问/home的请求,先调用Authentication,用户登陆检查
修改app.js文件,增加authentication,notAuthentication两个方法
function authentication(req, res, next) { if (!req.session.user) { req.session.error="请先登陆"; return res.redirect("/login"); } next();}function notAuthentication(req, res, next) { if (req.session.user) {req.session.error="已登陆";return res.redirect("/home"); } next();}配置好后,我们未登陆,直接访问localhost:3000/home时或者localhost:3000/logout,就会跳到/login页面