nodejs+express中利用中介軟體提高代碼複用
在用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 查詢)也可以通過中介軟體解決。