在任何 webapp 中,按加号按钮,值将增加。 当我快速点击按钮时,验证不起作用,导致验证无法阻止(例外行为,该值不在验证范围之外)。但价值将进一步降低,因为其余的要求将被提交。
重要提示:更新options
是动态的(例如$inc
或$set
)。
module.model.update({ _id: id }, options /* are dynamic */, { safe: true }, function (err, updatedDocument) {
if (err) return respond(400, err);
module.model.findOne({ _id: id }, function (err, foundDocument) {
if (err) return respond(400, err);
foundDocument.validate(function (err) {
if (err) return respond(400, err);
return respond(200, foundDocument); // callback method
});
});
});
module.model.findOne({ _id: id }, function (err, foundDocument) {
foundDocument.set(options);
foundDocument.validate(function (err) {
if (err) return respond(400, err);
foundDocument.save(function (err, savedDocument) {
if (err) return respond(400, err);
return respond(200, doc);
});
});
});
...然后在验证有效时执行保存。
但是有一个问题:set
方法不支持$inc
或其他伪设置器,还是支持?
我看到了使用constructor of the update function (Show Code)的可能性,但我不知道如何使用它:this.constructor.update.apply(this.constructor, args);
你对这个问题有什么好的做法吗?
答案 0 :(得分:0)
解决方案是为$ inc创建一个自定义版本。
我所做的就是替换mongoosejs的set
方法。
现在可扩展,但在更新之前需要一种安静的自定义验证方式。当有人有另一种解决方案。发布吧。
module.model.findOne({ _id: id }, function (err, foundDocument) {
for(var optionsProp in options) {
if(optionsProp === '$inc') {
for(var incProp in options[optionsProp]) {
foundDocument[incProp] += options[optionsProp][incProp];
}
}
}
foundDocument.validate(function (err) {
if (err) return respond(400, err);
foundDocument.save(function (err, savedDocument) {
if (err) return respond(400, err);
return respond(200, savedDocument);
});
});
});