9

我在将令牌附加到主干 url 查询字符串时遇到了一些麻烦,希望你们能在这里帮助我。三件事要知道,

  • 有一个rest api,每个请求都需要一个令牌
  • 一个执行身份验证的 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 在它不是“读取”方法并且不知道如何处理它时返回一个函数,另一个问题是当发出连续请求时,令牌被添加两次。我试图用那个 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。如果这是所有 Backbone 模型所需的行为,我想你也可以覆盖 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 : function() {
        return  "/my/url" + this.key;
    }

在您的覆盖.sync中,您只需要设置key属性。

于 2012-05-07T13:24:42.580 回答