9

バックボーンのURLクエリ文字列にトークンを追加するのに問題があります。皆さんがここで私を助けてくれることを願っています。知っておくべき3つのこと

  • リクエストごとにトークンを期待するRESTAPIがあります
  • 認証を行うnginxバックエンドは、バックボーンアプリと/apiの下のAPIへのプロキシリクエストを提供します
  • 私はjavascript+バックボーンの初心者です:/

バックボーンアプリは実際にCookieからトークンを読み取ります。バックボーンが呼び出しを行うたびに、これをリクエストURLに追加する必要があります。これは、バックボーン同期をオーバーライドすることで実行できるようです。しかし、それはいくつかの異なることで私を悩ませます。のように、これは私がすることです

console.log('overriding backbone sync');
var key ="token";
Backbone.old_sync = Backbone.sync
Backbone.sync = function(method, model, options) {
    if (method === 'read') {
        if (!(model.url.indexOf('?key=') != -1)) {
            model.url = model.url + '?key=' + key;
        }
    } else {
        old_url = model.url();
        if (!(old_url.indexOf('?key=') != -1)) {
            model.url = function() {
                return old_url + '?key=' + key;
            }
        }
    }
    Backbone.old_sync(method, model, options);
};

model.urlは、「読み取り」メソッドではなく、それを適切に処理する方法がわからないときに関数を返していました。他の問題は、連続したリクエストが行われたときに、トークンが2回追加されることです。私は運が悪かったそのindexOfのものでそれを削除しようとしました。

これを行うためのより良い方法はありますか?

4

2 に答える 2

15

オーバーライドする必要はまったくないと思いますsync

var globalKey = 'key123';

var urlWithKey = function(url, key) {
    return function() {
        return url + "?key=" + key;
    };
};

var MyModel = Backbone.Model.extend({
    url: urlWithKey('/my/url/', globalKey)
});

ここでオブジェクトを作成して保存すると、POST リクエストmy/url/?key=key123が送信されます。これがすべてのバックボーン モデルに必要な動作である場合は、url メソッドをオーバーライドすることもできると思います。

一般的な注意: Backbone ではurl、関数または値などのほとんどのパラメーター。あなたの例では、一度は関数であり、別のケースでは値だった理由はわかりませんが、内部関数の一部をオーバーライドする場合は、常に両方の方法を処理できる必要があります。Backbone のソースコードを見ると、getValueこれらのパラメーターにアクセスするために使用されていることがわかります。

var getValue = function(object, prop) {
    if (!(object && object[prop])) return null;
    return _.isFunction(object[prop]) ? object[prop]() : object[prop];
};

更新: すべてのモデルの url メソッドをオーバーロードすると、次のように機能する可能性があります。

var globalKey = 'key123';

(function() {
    var baseUrl = Backbone.Model.prototype.url;
    Backbone.Model.prototype.url = function() {
        return this.baseUrl + "?key=" + globalKey;
    };
})()

var MyModel = Backbone.Model.extend({
   baseUrl: '/my/url/'
});

通常の Backbone.Model をそのままにして、独自の基本クラスを作成することもできます。詳細については、 http://documentcloud.github.com/backbone/#Model-extendを参照してください。

于 2012-05-07T13:45:22.547 に答える
2

次のように URL を設定するだけです。

url : function() {
        return  "/my/url" + this.key;
    }

オーバーライドされた では、プロパティ.syncを設定するだけです。key

于 2012-05-07T13:24:42.580 に答える