应用更新选项而不保存以进行预验证 - mongoosejs

时间:2012-12-10 22:22:57

标签: node.js mongodb mongoose

在任何 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);

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

1 个答案:

答案 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);
        });
    });
});