express中的路由和登录拦截方案实践
SunShinewyf opened this issue · 1 comments
SunShinewyf commented
express中的路由和应用
express
中的路由还是很强大的,express
中的路由实现主要有如下几种形式:
应用实例路由
直接上代码:
var express = require('express');
var app = express();
// get路由
app.get('/', function(req, res) {
res.send('get');
});
//post路由
app.post('/', function (req, res) {
res.send('post');
});
这种是比较简单的,所以不多说
app.route()
app.route()
的功能是创建路由路径的链式路由句柄,我个人觉得就是将上面那种方法的分开写转化为一种链式形式,示例代码如下:
app.route('/Article')
.get(function(req, res) {
res.send('获取文章列表');
})
.post(function(req, res) {
res.send('添加文章');
})
.put(function(req, res) {
res.send('更新文章');
});
express.Router()
express
中的Router
实例是完整的中间件和路由系统,因此也被称为“微型应用程序",使用示例如下:
router/index.js
文件:
var express = require('express');
var router = express.Router();
//get路由
router.get('/a', function(req, res) {
res.send('get');
});
router.post('/b',function(req, res) {
res.send('post');
})
module.exports = router;
app.js
var index = require('./routes/index');
//.... other codes
app.use('/', routes);
使用express.Router
实现系统登录前的拦截功能,也就是说当用户未登录时,没有权限访问一些页面。只有登录后才可以访问。要实现这种功能,需要使用express-session
记录当前登录的用户信息,关于这个库的详细信息,可以点击这里,下面用两种方法实现
第一种
- 首先创建一个
login
表单(由于比较简单,所以就不贴代码了) route/index.js
路由文件中的代码如下:
// 登录页面
//如果直接访问/login时则显示登录页面
router.get('/login',function(req,res){
res.render('login', { title:'用户登录' });
});
// 查看文章页面
//用户未登录时跳转到登录页面
router.get('/write',function(req,res){
var user = req.session.user; //获取session中的user信息
if(!user){
res.render('login',{title:'用户登录'});
}else{
res.render('article',{ title:'文章页面'});
}
})
第二种
- 同样创建一个
login
表单 - 在
app.js
中进行拦截,定义一个中间件,在中间件中执行一些参数检查和登录拦截的逻辑即可,具体代码如下:
app.use(session({
secret:"myzhibie",
store:new MongoStore({
mongooseConnection:db.dbCon //这里使用了connect-mongo库,
})
}));
app.use(function(req,res,next){
var url = req.originalUrl;
var user = req.session.user; //记录登录的信息
if((url == '/article') && !req.session.user){ //在这里进行拦截判断
req.session.error = '还没登录,请先登录';
return res.redirect('/login');
}
next();
})
但是我个人比较倾向于第二种方法,因为具有更大的灵活性,可以根据自己的业务复杂程度添加自己的逻辑,而且使用的是中间件,对理解中间件的原理有较大的帮助
总结
express.Router()
是在express4.0
中才添加的,但是相比于应用路由有更大的优势,具体可以总结为如下几点:
- 多次使用
express.Router()
可以创建多组路由 - 可以使用中间件对
request
做一些验证和过滤处理
schwanncheung commented
👍🏻赞!了解了express的原理,感觉可以换用koajs框架,这是express原班人马后来做的框架,eggjs底层也是koajs