2015-10-06 107 views
1

我有一个对象,其中有一些对象有时在保存时为空。我最初的想法是在保存前删除空的字段,但由于某种原因,似乎没有工作。对象值保存后仍然存在。猫鼬删除空对象或阵列

module.exports = function(req, res, next) { 
var newRecipe = new Recipe(req.body); 

newRecipe.pre('save', function (next) { 

    var that = this.data; 

    Object.keys(that.data).forEach(function(key) { 
    if(that.data.hasOwnProperty(key)){ 
     if(typeof that.data[key] != 'undefined'){ 
     if (!that.data[key].length){ 
      delete that.data[key]; 
     }; 
    } 
    } 
}); 

    next(); 
}); 

newRecipe.save(function(err, recipe) { 
    if (err) { 
    console.log(err); 
    res.sendStatus(500); 
    } else { 
    res.sendStatus(200); 
    } 
}); 
}; 

这里是我的传入对象:

{ 
    notes: [], 
    isHostessGift: false, 
    playbook: {}, 
    location: {}, 
    wine: { ingredient: false, pairing: false }, 
    coupons: [], 
    ingredients: [{ item: 'd' }], 
    categories: { dishType: ["Beverage"], mainIngredient: ["d"] }, 
    directions: [{ step: 'd' }], 
    serves: 9, 
    cookTime: 9, 
    prepTime: 8, 
    headline: 'ccc' 
} 

是否有这更好的方法呢?

编辑:由于某些原因,从chridam的回答中工作继承的属性正在通过hasOwn属性函数。

var hasOwnProperty = Object.prototype.hasOwnProperty; 

function isPropertyEmpty(obj) { 
if (obj == null)  return true; 
if (obj.length > 0) return false; 
if (obj.length === 0) return true; 
for (var key in obj) { 
    if (hasOwnProperty.call(obj, key)){ 
     console.log(key); 
    } 
} 
return true; 


} 



module.exports = function(req, res, next) { 
    var newRecipe = new Recipe(req.body); 

newRecipe.pre('save', function (next) { 

var doc = this; 
    Object.keys(doc).forEach(function(key) { 
     if (isPropertyEmpty(doc[key])){ 
      // console.log(_.omit(doc, doc[key])); 
     }; 
    }); 

console.log(doc); 


    next(); 
}); 

慰问了DOC:

strictMode 
selected 
shardval 
saveError 
validationError 
adhocPaths 
removing 
inserting 
version 
getters 
_id 
populate 
populated 
wasPopulated 
scope 
activePaths 
ownerDocument 
fullPath 
emitter 
createdAt 
sites 
published 
featured 
data 
_id 
slug 
image 
$__original_save 
save 
$__original_save 
save 
{ image: 'lol.jpg', 
    slug: 'lol', 
    _id: 561522878ff1d2f9ae9b4323, 
    data: 
    { headline: 'lol', 
    prepTime: 22, 
    cookTime: 6, 
    serves: 8, 
    directions: [ [Object] ], 
    categories: { mainIngredient: [Object], dishType: [Object] }, 
    ingredients: [ [Object] ], 
    coupons: [], 
    wine: { pairing: false, ingredient: false }, 
    location: {}, 
    playbook: {}, 
    isHostessGift: false, 
    notes: [] }, 
    featured: false, 
    published: false, 
    sites: [ 'HOL' ], 
    createdAt: Wed Oct 07 2015 09:47:51 GMT-0400 (EDT) } 
+0

你能显示你的模式吗? –

+0

您可以删除数据对象的属性,但架构是具体的。所有未定义的属性都将通过猫鼬使用默认值(空值,空值,'')值进行保存。 –

回答

2

我有一个很大的问题,这个解决方案时有嵌套可选Array场模式。我解决了这个创建一个新的类型:

optional_array = 
    type: Mixed 
    validate: 
    validator: (v) -> 
     return v instanceof Array 
    message: '{VALUE} needs to be an array.' 

,然后我的所有字段设置为optional_array而不是Array