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的方式
2.現在我們嘗試加入middleware,先新增檔案 parseMiddleware.js
由於我們只需要針對登入做處理,parse登入的api路徑為login、http post method,所以設定 router.post('/login')
3.完成parseMiddleware.js後,於之前的app.js中補上middleware的設定
如此一來每次有路徑為 /parse/login 的post呼叫,就會先執行插入的middleware,來將res.send置換掉,如此就能做到改寫回覆資料內容的動作了。
4.缺點,這樣的作法多少依賴於對parse-server的了解,自然需要注意之後的版本是否會調整相關叫用的部份,或者回傳的資料結構有什麼異動之類的,不過在使用外部套件的狀況下難免會有這樣的情形發生吧,未來有想到更好的處理方式再回來調整了。
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(res, arguments);
}
//別忘了呼叫 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的了解,自然需要注意之後的版本是否會調整相關叫用的部份,或者回傳的資料結構有什麼異動之類的,不過在使用外部套件的狀況下難免會有這樣的情形發生吧,未來有想到更好的處理方式再回來調整了。
留言