nodejs+express中利用中间件提高代码复用

在用nodejs+express+mysql做后台时,有很多涉及到用户信息的请求都要先判断请求中的token(用户名+时间戳+随机数采用sha1加密得到的随机字符串)是否有效。

一开始是在每个请求的处理中都加入了对token的判断。(写了n遍,脑袋抽了)

代码如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//修改项目的状态
router.post( '/change-project' ,validToken,function(req,res,next){
     var db = req.db;
     var token = req.query.token;
     var id = req.query.id;
     var projectStatus = req.query.status;
     var data = {
         status : false ,
         message :
     }
     db.getConnection(function(err,conn){
         if (err){
             sendData(req,res,next,conn,err);
         } else {
             db.query( 'SELECT * FROM user WHERE user_token = ' +token+ '' ,function(err,row){ //判断token是否有效
                 if (err){
                     sendData(req,res,next,conn,err);
                 } else {
                     if (row.length == 0 ){
                         sendData(req,res,next,conn,请登录); //无效返回错误信息
                     } else { //若token有效修改状态
                         db.query( 'UPDATE project SET project_status = ' + projectStatus + ' WHERE project_id = ' + id + '' , function (err, row) {
                             if (err) {
                                 sendData(req, res, next, conn, err);
                             } else {
                                 data.message = (row.affectedRows == 1 ) ? 修改成功 : 修改失败;
                                 data.status = (row.affectedRows == 1 ) ? true : false ;
                                 res.send({ 'data' : data});
                                 conn.release();
                             }
                         })
                     }
                 }
             })
 
         }
     })
})


 

涉及到token验证的地方比较冗余,因为在每个需要验证的函数里都要写一遍。

所以讲验证token的这部分提出来变成一个中间件

代码如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function validToken(req, res, next){
     var db = req.db;
     var userToken = req.query.token;
     db.getConnection(function(err,conn){
         if (err){
             sendData(req,res,next,conn,err);
         } else {
             db.query( 'SELECT * FROM user WHERE user_token = ' +userToken+ '' ,function(err,row){
                 if (err){
                     sendData(req,res,next,conn,err);
                 } else {
                     if (row.length == 0 ){
                         sendData(req,res,next,conn,请登录);
                     } else {
                         next();
                     }
                 }
             })
         }
     })
}
//出错时返回一个data对象
function sendData(req,res,next ,conn,message){
     var data = {
         message : , //出错信息
         status : false //状态
     }
     data.message = message;
     conn.release();
     res.send({data : data});
 
}

然后将这个中间件应用到对应的路由中,

 

这样第一个路由就变成了,下面的样纸:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//修改项目的状态
router.post( '/change-project' ,validToken,function(req,res,next){
     var db = req.db;
     var token = req.query.token;
     var id = req.query.id;
     var projectStatus = req.query.status;
     var data = {
         status : false ,
         message :
     }
     db.getConnection(function(err,conn){
         if (err){
             sendData(req,res,next,conn,err);
         } else {
             db.query( 'UPDATE project SET project_status = ' + projectStatus + ' WHERE project_id = ' + id + '' , function (err, row) {
                 if (err) {
                     sendData(req, res, next, conn, err);
                 } else {
                     data.message = (row.affectedRows == 1 ) ? 修改成功 : 修改失败;
                     data.status = (row.affectedRows == 1 ) ? true : false ;
                     res.send({ 'data' : data});
                     conn.release();
                 }
             })   
         }
     })
})

这样别的需要验证token就无需重复在写,可以直接重用。

 

其实,关于查询数据库时的一层层嵌套(if(err) 错误处理 else 查询)也可以通过中间件解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值