0

在任何web 应用程序中,我按下加号按钮,就会增加一个值。当我快速按下按钮时,验证不起作用,导致验证不会阻止(例外行为,值不在验证范围之外)。但是该值将被进一步设置,因为其余的请求将被提交。

重要提示:更新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或其他伪设置器,或者是吗?

我看到了使用更新函数的构造函数(显示代码)的可能性,但我不知道如何使用它:this.constructor.update.apply(this.constructor, args);

你对这个问题有什么好的做法吗?

4

1 回答 1

0

解决方案是为 $inc 创建一个定制版本。我所做的是替换setmongoosejs 的方法。

这现在是可扩展的,但在更新之前是一种安静的自定义验证方式。当有人有其他解决方案时。请张贴。

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);
        });
    });
});
于 2012-12-11T19:23:25.893 回答