expressjs,如何監聽res.send事件

事情是這樣的,目前的專案使用了parse-server,然後我想要介入使用者登入的行為,比如登入成功後針對某些user的資料做處理等等,不過又不想直接改寫parse-server的原始碼,所以就搜尋了一下能否攔截res.send事件,在stackoverflow找到了下面這篇:

http://stackoverflow.com/questions/33732509/express-js-how-to-intercept-response-send-response-json

那就開始實作吧!
1.先簡單講一下express專案使用parse-server的方式


/** 
 * App.js
 * express相關設定不另外說明,只列出 parse-server 部分
 */

var ParseServer = require('parse-server').ParseServer;
//Parse server的參數設定
var ParseServerOption = {
  //各種參數
  ....
}

//產生回應api呼叫的物件
var api = new ParseServer(ParseServerOption);
//設定parse的路由
app.use('/parse' api);



2.現在我們嘗試加入middleware,先新增檔案 parseMiddleware.js
/** 
 * parseMiddleware.js
 */

const express = require('express');
const router = express.Router();

/** 
 * 攔截 Parse 的login事件
 */
router.post('/login'function(req , res , next){
    //當login時抽換掉res.send事件
    var oldSend = res.send;
    res.send = function(data){
        //先執行取代send後要做的事情,不如置換資料內容
        // res.send的第一個參數 arguments[0](或 data)就是回覆的body,修改範例如下
        arguments[0] = "modified : " + arguments[0];
        // 異動完之後,呼叫原本的send函式
        return oldSend.apply(resarguments);   
    }
    //別忘了呼叫 next 結束middleware的執行喔
    return next();
}



由於我們只需要針對登入做處理,parse登入的api路徑為login、http post method,所以設定 router.post('/login')

3.完成parseMiddleware.js後,於之前的app.js中補上middleware的設定


/** 
 * App.js
 * express相關設定不另外說明,只列出 parse-server 部分
 */

var ParseServer = require('parse-server').ParseServer;
//宣告剛剛新增的middleware router
var parseMiddleware = require('./parseMiddleware');
//Parse server的參數設定
var ParseServerOption = {
  //各種參數
  ....
}

//產生回應api呼叫的物件
var api = new ParseServer(ParseServerOption);
//設定parse的路由,中間插入 parseMiddleware
app.use('/parse' parseMiddleware api);


如此一來每次有路徑為 /parse/login 的post呼叫,就會先執行插入的middleware,來將res.send置換掉,如此就能做到改寫回覆資料內容的動作了。

4.缺點,這樣的作法多少依賴於對parse-server的了解,自然需要注意之後的版本是否會調整相關叫用的部份,或者回傳的資料結構有什麼異動之類的,不過在使用外部套件的狀況下難免會有這樣的情形發生吧,未來有想到更好的處理方式再回來調整了。


留言

這個網誌中的熱門文章

天雨粟、鬼夜哭、思念漫太古。

蘇打綠 - 御花園

Nodejs Base64 Url Safe