2014-06-30 29 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());