在用nodejs+express+mysql做后台时,有很多涉及到用户信息的请求都要先判断请求中的token(用户名+时间戳+随机数采用sha1加密得到的随机字符串)是否有效。
一开始是在每个请求的处理中都加入了对token的判断。(写了n遍,脑袋抽了)
代码如下:
//修改项目的状态 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的这部分提出来变成一个中间件
代码如下:
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}); }
这样第一个路由就变成了,下面的样纸:
//修改项目的状态 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(); } }) } }) })
其实,关于查询数据库时的一层层嵌套(if(err) 错误处理 else 查询)也可以通过中间件解决。
具体可以看这篇博客:http://www.360doc.com/content/14/1003/20/14106735_414210206.shtml
睡养颜觉去了~~
原文地址:http://blog.csdn.net/stellar1993/article/details/45034077