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 に答える