2014-06-30 58 views
3

我正試圖迭代中間件函數內的貓鼬模型中的字段。當前上下文this是模型對象本身。所以我有一個功能,其中的背景是一個Javascript對象是這樣的:如何遍歷中間件函數中的Mongoose模型屬性?

{ 
    lastName: 'Wilkens', 
    firstName: 'Elepart', 
    name: 'Elepart Wilkens', 
    username: 'eK', 
    bio: '<script>alert(\'this is a hack!!\')', 
    _id: 53b17dd0e8c5af50c1d73bc6, 
    language: 'en', 
    country: 'USA', 
    online: true 
} 

我想這個對象(這在目前的函數表示與this)遍歷。每次我嘗試循環迭代時,它都會輸出看起來像內部Javascript元數據的值。如果this代表一個對象,是否有可能在函數內迭代this

下面是實際的中間件功能:

userSchema.pre('save', function (next) { 
    console.log(this); // This prints precisely the same object I have copied above 

    var fields = Object.keys(this); 

    for(var i = 0; i < fields.length; i++) { 
     console.log(this[fields[i]]); 
    } 

    for(var key in this) { 
     if(this.hasOwnProperty(key)) { 
     console.log(this[key]); 
     } 
    } 
}); 

,輸出是:

{ 
strictMode: true, 
selected: undefined, 
shardval: undefined, 
saveError: undefined, 
validationError: undefined, 
adhocPaths: undefined, 
removing: undefined, 
inserting: undefined, 
version: undefined, 
getters: {}, 
_id: undefined, 
populate: undefined, 
populated: undefined, 
wasPopulated: false, 
scope: undefined, 
activePaths: 
    { paths: 
     { username: 'modify', 
     firstName: 'modify', 
     name: 'modify', 
     online: 'default', 
     country: 'default', 
     language: 'default', 
     _id: 'default', 
     bio: 'modify', 
     lastName: 'modify' }, 
    states: { default: [Object], init: {}, modify: [Object], require: {} }, 
    stateNames: [ 'require', 'modify', 'init', 'default' ], 
    map: [Function] }, 
    ownerDocument: undefined, 
    fullPath: undefined } 
true 
undefined 
0 
{ online: true, 
    country: 'USA', 
    language: 'en', 
    _id: 53b1825a00ed9af7c12eedf9, 
    bio: '<script>alert(\'this is a hack!!\')', 
    username: 'yK', 
    name: 'Yershay Wilkens', 
    firstName: 'Yershay', 
    lastName: 'Wilkens' } 
{ save: 
    [ { [Function] isAsync: false }, 
    { [Function: checkForExistingErrors] isAsync: false }, 
    { [Function: validation] isAsync: false }, 
    { [Function] isAsync: false }, 
    { [Function] isAsync: false } ], 
    validate: [ { [Function] isAsync: false } ] } 
{ save: [], validate: [] } 
{ [Function] numAsyncPres: 0 } 
{ [Function] numAsyncPres: 0 } 
{} 
+1

你可以發佈您當前使用的循環? – Duane

+1

或者你可以設置一個小提琴?我認爲這是可能的 –

+1

沒有更多的代碼,我們不能幫你。雖然這是一個如何工作的例子:http://jsbin.com/gomisuyu/1/ – Yoshi

回答

4

我找到了一個稍微不同的方式來完成我想這是遍歷的模型屬性中間件功能內的Mongoose模型。這使用async.js,但您可以重構它以使用通用JS循環或任何其他控制流庫。關鍵是獲取文檔字段的數組,然後您可以遍歷這些字段,並使用當前上下文獲取/設置值爲this。據我所知,這將不是脅迫非字符串值到字符串。我用字符串,數字,布爾值和objectIds進行了測試,並將它們成功保存爲其原始數據類型。

yourSchema.pre('save', function (next) { 
    var self = this; 

    // Get the document's fields 
    var fields = Object.keys(this._doc); 

    // Do whatever you want for each field 
    async.each(fields, function(field, cb) { 
    self[field] = validator.escape(self[field]); 
    cb(); 
    }, function(err){ 
    next(); 
    }); 
}); 
6

您使用整數指標,而不是從田裏陣列字符串引用。它應該是:

var fields = Object.keys(this); 

for(var i = 0; i < fields.length; i++) { 
    console.log(this[fields[i]]); 
} 

(例如,你在做this[1]this[2],而不是this[fields[1]]

+0

好,但我只是更新了問題...我仍然得到相同的輸出,基本上JS Jibberish當我這樣做時[字段[i]] –

+3

@Glen嘗試將第一行更改爲:'var fields = Object.keys (this.toObject());' – JohnnyHK

+0

無論如何,我發現使用Object.keys()和this._doc是獲取模型屬性的最佳方式,而不是所有我似乎獲得的JS東西通過單獨使用'this'。 –

1

@ JohnnyHK的評論工作對我來說:

const user = new User(); 
const schemaKeys = Object.keys(user.toObject());