nodejs+express中利用中介軟體提高代碼複用

來源:互聯網
上載者:User

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 查詢)也可以通過中介軟體解決。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.