nodejs+express中利用中间件提高代码复用
来源:互联网 发布:新手特效制作软件 编辑:程序博客网 时间:2024/06/15 09:00
在用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(); } }) } })})
这样别的需要验证token就无需重复在写,可以直接重用。
其实,关于查询数据库时的一层层嵌套(if(err) 错误处理 else 查询)也可以通过中间件解决。
具体可以看这篇博客:http://www.360doc.com/content/14/1003/20/14106735_414210206.shtml
睡养颜觉去了~~
1 0
- nodejs+express中利用中间件提高代码复用
- nodejs+express中利用中间件提高代码复用
- Nodejs express之中间件
- NodeJs express自定义中间件
- [nodejs][express]中间件
- nodejs开发 express路由与中间件
- nodejs开发 express路由与中间件
- nodejs 实践:express 最佳实践(二) 中间件
- Nodejs进阶:Express常用中间件body-parser实现解析
- Nodejs 进阶:Express 常用中间件 body-parser 实现解析
- Nodejs 进阶:Express 常用中间件 body-parser 实现解析
- nodejs使用express,express版本3.5.3使用中间件app.user(express.multipart())异常问题
- nodejs Express 中session使用
- nodeJs-express中使用session
- express 中间件
- express 中间件
- nodesj中 中间件express-session的理解
- nodeJs express允许跨域代码
- 百度地图api的url请求的参数规则
- adb命令查看包名和adb启动你的apk
- 为向量法求组合问题
- URAL 2034 Caravans (最短路 + 二分)
- OutOfMemoryError: PermGen space及其解决方法
- nodejs+express中利用中间件提高代码复用
- 创造新语言(1)——确定架构
- 玩转Arduino之开篇
- 4、角色
- 【ZJU】3863 Paths on the Tree 【浙大2015年4月校赛D题】 树分治
- NMock学习系列(一)--- 对象及数据库模拟介绍
- 利用GitHub开源组件PullToRefresh实现上拉下拉弹簧效果
- 解题报告 之 POJ1273 Drainage Ditches
- linux学习:基础知识