2012-08-02 25 views
1

我正在編寫使用Mongoose ODM的Express.js應用程序。 在創建文件/更新,我想它會自動獲得一些字段填入:Mongoose + Express - 在文檔中保存用戶的正確方法是什麼(審計信息)

  • createdBy
  • createdOn

在我看來,正確的地方來實現,這將是在一個Mongoose插件,用這些屬性擴充文檔,並提供默認和/或貓鼬中間件來填充字段。

但是,我完全不知道如何從插件中的會話中獲取用戶名。 有什麼建議嗎?

/** 
* A mongoose plugin to add mandatory 'createdBy' and 'createdOn' fields. 
*/ 
module.exports = exports = function auditablePlugin (schema, options) { 
    schema.add({ 
    createdBy: { type: String, required: true, 'default': user } 
    , createdOn: { type: Date, required: true, 'default': now } 
    }); 
}; 

var user = function(){ 
    return 'user'; // HOW to get the user from the session ??? 
}; 

var now = function(){ 
    return new Date; 
}; 

回答

0

你不能做到這一點這樣的,bacause user功能被添加作爲該模式的原型方法。特別是它是獨立的請求/響應。但是有一個黑客。如果你有型schema的對象obj,那麼您可以在請求處理程序做

obj.session = req.session; 

。然後您可以從該函數訪問會話。然而,這可能會導致其他問題(例如,在此集合上運行cron作業),並且它看起來像對我非常不利的練習。

您可以手動執行此操作,當前用戶創建此架構對象時,您不能嗎?或者創建靜態方法:

MySchema.statics.createObject = function (user) { 
    // create your object 
    var new_object = MySchema(...); 
    // set necessary fields 
    new_object.createdBy = user.username; 
} 
+0

你說得對,這個黑客聞起來很腥。我很喜歡這個解決方案,它不會強制我通過每個控制器來爲保存的模型設置用戶,儘管... – 2012-08-02 12:48:08

+0

@LaurentVB我不認爲這是可能的。 – freakish 2012-08-02 12:52:17

相關問題