2016-01-22 24 views
0

語境:節點請求/連接特定的變量

我試圖鏈接日誌條目與這些項的生成相關的請求。我喜歡bunyan的child記錄器的概念,它允許我將一個請求ID附加到子記錄器所做的任何後續記錄中。我希望這個記錄器被用在其他模塊中,所以我require帶有getter的文件來獲取子記錄器。這允許以其它方式分離的事件如getting widgets被鏈接到導致該條目中的請求

人爲的例子:

index.js

var widget = require('./widget'); 
var logging = require('./logging'); 
//... 
app.use('*', function(req, res, next) { 
    var logger = logging.getLogger(); 
    var child = logger.child({requestId: req.id}); //req.id set in earlier middleware 
    logging.setLogger(child); 
}; 
app.get('/widgets', function(req, res, next) { 
    res.json(widgets.getAll()); 
}; 
//... 

widget.js

var logging = require('./logging'); 
//... 
exports = module.exports = { 
    getAll: function() { 
     logging.getLogger().info("getting widgets"); 
     return widgets; 
    } 
} 

與此問題狀態是在請求(單例?)之間共享的,所以如果兩個請求幾乎是模擬的同樣,「獲取小部件」日誌條目將requestId屬性設置爲第二個請求的ID。

的問題是:

有一種方法爲具有變量,其範圍被附接到該請求,而無需注入並圍繞req對象傳遞(例如new widget()和/或widget.setRequest(req))或實例化作爲注入logging對象?像這樣將對象傳遞到其他模塊感覺就像違反了關注的分離

換言之,共享請求的狀態而不是跨請求實現我想實現的目的的最佳方式是什麼?

+0

'logging.setLogger(logging.getLogger()'...我的眼睛我從來沒有在xx –

+0

@PatrickRoberts之前看過如此詳細的node.js,這只是一個非常有意思的例子,只是爲了得到這個觀點。推薦?會有更多的幫助嗎? – rwilson04

+0

我找不到任何引用' req.id'。從哪裏來? –

回答

0

你可以通過改變你的代碼給每個請求其自己的專用子記錄:

app.use('*', function(req, res, next) { 
    req.fooBarLogger = logging.getLogger().child({requestId: req.id}); 
}); 
app.get('/widgets', function(req, res, next) { 
    res.json(widgets.getAll(req)); 
}); 

module.exports = { 
    getAll: function(req) { 
     req.fooBarLogger.info("getting widgets"); 
     return widgets; 
    } 
}; 
+0

Darn,擊敗了我...我通過解釋同樣的事情達到了一半。這是我的邏輯:我的想法是,如果你需要與特定的請求對象有關的控制檯日誌,而不是將參考文件存儲在'logging'模塊中,你可以將它直接附加到'req'對象,因爲任何控制檯日誌與'req'關聯的將更有可能具有對'req'對象的作用域訪問權限。 –

+0

我在我的問題中有這個「無需注入並傳遞req對象」。當小部件的依賴關係具有進一步的依賴關係時,它會變得更加複雜,這也需要'req'對象,或者當小部件不需要它,但是它的依賴關係時。這就是爲什麼它看起來違反了SoC原則。如果將它注入到所有的依賴關係和子依賴關係是獲得我所希望的功能的唯一方法,我想我只需要接受它 – rwilson04

+0

您不必將它附加到'req'。例如,你可以直接傳遞它。然而,那需要*所有需要做記錄的功能現在需要另一個參數 - 這更加複雜並且不總是可能的。將記錄器掛在'req'對象上通常是最便宜的方式來獲得你想要的。已經通過'req'對象的函數可以免費獲得記錄器。 – cybersam