我有一个对象,其中的字段有时在保存时为空。我最初的想法是在预先保存时删除空字段,但由于某些原因似乎没有起作用。保存后,对象值仍然存在。
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();
});
安慰文档:
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 :(得分:2)
当存在具有可选Array
字段的嵌套模式时,我遇到了很多此问题的问题。我通过创建一个新类型来解决这个问题:
optional_array =
type: Mixed
validate:
validator: (v) ->
return v instanceof Array
message: '{VALUE} needs to be an array.'
然后将我的所有字段设置为optional_array
而不是Array
。