SunShinewyf/issue-blog

express中的路由和登录拦截方案实践

SunShinewyf opened this issue · 1 comments

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做一些验证和过滤处理

👍🏻赞!了解了express的原理,感觉可以换用koajs框架,这是express原班人马后来做的框架,eggjs底层也是koajs