Page 128 - Node.js开发指南
P. 128
5.6 用户注册和登录 121
未登入的状态。现在我们还有一个工作要做,就是为页面设置访问权限。例如,登出功能应 1
该只对已登入的用户开放,注册和登入页面则应该阻止已登入的用户访问。如何实现这一点
呢?最简单的方法是在每个页面的路由响应函数内检查用户是否已经登录,但这会带来很多
①
重复的代码,违反了 DRY 原则。因此,我们利用路由中间件来实现这个功能。
5.3.5 节介绍了同一路径绑定多个响应函数的方法,通过调用 next() 转移控制权,这种 2
方法叫做路由中间件。我们可以把用户登入状态检查放到路由中间件中,在每个路径前增加
路由中间件,即可实现页面权限控制。
最终的 routes/index.js 内容如下:
3
var crypto = require('crypto');
var User = require('../models/user.js');
module.exports = function(app) {
app.get('/', function(req, res) { 4
res.render('index', {
title: '首页'
});
});
5
app.get('/reg', checkNotLogin);
app.get('/reg', function(req, res) {
res.render('reg', {
title: '用户注册',
}); 6
});
app.post('/reg', checkNotLogin);
app.post('/reg', function(req, res) {
//检验用户两次输入的口令是否一致 7
if (req.body['password-repeat'] != req.body['password']) {
req.flash('error', '两次输入的口令不一致');
return res.redirect('/reg');
}
//生成口令的散列值 8
var md5 = crypto.createHash('md5');
var password = md5.update(req.body.password).digest('base64');
var newUser = new User({
name: req.body.username, 9
password: password,
});
——————————
① DRY (Don’t Repeat Yourself) 是软件工程设计的一个基本原则,又称“一次且仅一次”(Once And Only Once), 10
指的是开发中应该避免相同意义的代码重复出现。