2017-03-04 40 views
0

所以我想用winston來記錄我的應用程序所做的所有請求。我通過superagent讓所有API請求,我基本上要建立某種類似中間件:將superagent換成更高順序的函數以具有全局錯誤日誌記錄?

// Global error middleware 
superagent.on('request', req => winston.log(req)) 

然後在另一個文件,導入superagent正常和它的工作:

import superagent from 'superagent' 
const request = superagent.get('url' ..etc) 

我不希望導入自己的包裝函數,因爲恐怕團隊中的其他開發人員會忘記這種做法,直接從superagent導入,從而避免錯誤日誌記錄。我顯然也不希望將日誌記錄到superagent樣板的數十個實例中。

我搜索了一下,發現,令人驚訝的是,基本上沒有解決方案。有沒有辦法?或者我猜我可以在我的webpack配置中設置一個別名?

回答

-1

您可以在您的項目中創建一個子包並鏈接到該包。你需要執行幾個文件:

首先創建該子包的文件夾,在我的情況:lib/superagent+logger(相對於主項目文件夾)

名稱可以改變你希望,除了name在下面的文件。

lib/superagent+logger/package.json

{ 
    "name": "superagent", 
    "version": "0.1.0", 
    "description": "superagent wrapper that adds a global logger", 
    "main": "index.js", 
    "dependencies": { 
     "superagent": "latest" 
    } 
} 

的名字是假的SuperAgent重要的,不能改變

lib/superagent+logger/index.js

var superagent = require("superagent"); 

function logRequest(req){ 
    //that's the part you'd want to implement 
    console.log('tracing signal to ', JSON.stringify(req.url)); 
} 

function Smith(){ return superagent.apply(null, arguments).on('request', logRequest); } 
Object.setPrototypeOf(Smith, superagent); 
module.exports = Object.assign( 
    Smith, 
    { 
     Request(method, url){ 
      return superagent.Request(method, url).on('request', logRequest) 
     }, 
     agent(options){ 
      return superagent.agent(options).on('request', logRequest) 
     }, 
     Response(req){ 
      return superagent.Response(req).on('request', logRequest) 
     }, 
     acl(url, data, fn){ 
      return superagent.acl(url, data, fn).on('request', logRequest) 
     }, 
     bind(url, data, fn){ 
      return superagent.bind(url, data, fn).on('request', logRequest) 
     }, 
     checkout(url, data, fn){ 
      return superagent.checkout(url, data, fn).on('request', logRequest) 
     }, 
     connect(url, data, fn){ 
      return superagent.connect(url, data, fn).on('request', logRequest) 
     }, 
     copy(url, data, fn){ 
      return superagent.copy(url, data, fn).on('request', logRequest) 
     }, 
     delete(url, data, fn){ 
      return superagent.delete(url, data, fn).on('request', logRequest) 
     }, 
     get(url, data, fn){ 
      return superagent.get(url, data, fn).on('request', logRequest) 
     }, 
     head(url, data, fn){ 
      return superagent.head(url, data, fn).on('request', logRequest) 
     }, 
     link(url, data, fn){ 
      return superagent.link(url, data, fn).on('request', logRequest) 
     }, 
     lock(url, data, fn){ 
      return superagent.lock(url, data, fn).on('request', logRequest) 
     }, 
     "m-search": function(url, data, fn){ 
      return superagent["m-search"](url, data, fn).on('request', logRequest) 
     }, 
     merge(url, data, fn){ 
      return superagent.merge(url, data, fn).on('request', logRequest) 
     }, 
     mkactivity(url, data, fn){ 
      return superagent.mkactivity(url, data, fn).on('request', logRequest) 
     }, 
     mkcalendar(url, data, fn){ 
      return superagent.mkcalendar(url, data, fn).on('request', logRequest) 
     }, 
     mkcol(url, data, fn){ 
      return superagent.mkcol(url, data, fn).on('request', logRequest) 
     }, 
     move(url, data, fn){ 
      return superagent.move(url, data, fn).on('request', logRequest) 
     }, 
     notify(url, data, fn){ 
      return superagent.notify(url, data, fn).on('request', logRequest) 
     }, 
     options(url, data, fn){ 
      return superagent.options(url, data, fn).on('request', logRequest) 
     }, 
     patch(url, data, fn){ 
      return superagent.patch(url, data, fn).on('request', logRequest) 
     }, 
     post(url, data, fn){ 
      return superagent.post(url, data, fn).on('request', logRequest) 
     }, 
     propfind(url, data, fn){ 
      return superagent.propfind(url, data, fn).on('request', logRequest) 
     }, 
     proppatch(url, data, fn){ 
      return superagent.proppatch(url, data, fn).on('request', logRequest) 
     }, 
     purge(url, data, fn){ 
      return superagent.purge(url, data, fn).on('request', logRequest) 
     }, 
     put(url, data, fn){ 
      return superagent.put(url, data, fn).on('request', logRequest) 
     }, 
     rebind(url, data, fn){ 
      return superagent.rebind(url, data, fn).on('request', logRequest) 
     }, 
     report(url, data, fn){ 
      return superagent.report(url, data, fn).on('request', logRequest) 
     }, 
     search(url, data, fn){ 
      return superagent.search(url, data, fn).on('request', logRequest) 
     }, 
     subscribe(url, data, fn){ 
      return superagent.subscribe(url, data, fn).on('request', logRequest) 
     }, 
     trace(url, data, fn){ 
      return superagent.trace(url, data, fn).on('request', logRequest) 
     }, 
     unbind(url, data, fn){ 
      return superagent.unbind(url, data, fn).on('request', logRequest) 
     }, 
     unlink(url, data, fn){ 
      return superagent.unlink(url, data, fn).on('request', logRequest) 
     }, 
     unlock(url, data, fn){ 
      return superagent.unlock(url, data, fn).on('request', logRequest) 
     }, 
     unsubscribe(url, data, fn){ 
      return superagent.unsubscribe(url, data, fn).on('request', logRequest) 
     }, 
     del(url, data, fn){ 
      return superagent.del(url, data, fn).on('request', logRequest) 
     } 
    } 
); 

//wrapper built and ready to use 
console.log("Hello Mr Anderson\n"); 

並在實際項目:

/package.json

{ 
    ... 
    "dependencies": { 
     "superagent": "file:lib/superagent+logger" 
    } 
} 

和一個簡單的測試:

var request = require("superagent"); 
void request.get("http://google.de").end(); 

編輯:

lib/superagent+logger/index.js寫了一部分以前動態編譯並讓你感到困惑。

+沒有動態構建方法
-沒有動態構建方法

與模塊沒有surprizes,但它並不適應內superagent執行/版本變化要麼;您必須手動執行此操作。

而當我讀這可能有一些方法,你想要刪除。我的主要目標是如何將這個包裝器注入/加載到實際項目中,而不是superagent本身。

+0

你的'index.js'非常難讀,充滿了奇怪的語法選擇和正則表達式。小心解釋它實際上在做什麼?替換'superagent'方法? –

+0

@John Doe。不,它根本不修改超炫。它包裝它。首先它爲superagent方法創建一個名爲「Smith」的包裝器,它爲superagent上的每個方法創建一個包裝器,該包裝器將調用轉發給相應的superagent方法並附加一個'.on('request',logRequest)'。 「怪異」部分創建一個動態函數體作爲一個字符串來命名包裝方法,並給它們相同的參數,......基本上只是糖的錯誤報告*(我猜3AM付出了代價)*。您可以記錄'methods'來檢出構建的函數體。我稍後添加一個更簡單的版本。 – Thomas

+0

根本無法完成這項工作。爲什麼你使用本地文件,然後通過npm安裝呢?爲什麼不只是別名? –