2013-07-22 32 views
3

我目前正在使用Node.js,Express.js,Backbone.js和MongoDB开发应用程序。我正面临有关如何处理模型需要使用多于标准ID参数来获取(GET)服务器的情况的设计问题。使用Backbone.js实现多参数GET获取Node.js/Express.js REST API

让我们考虑下面这个简单的例子:

Book = Backbone.Model.extend({ 

    urlRoot : "/io/books", 

    defaults : { 
    author : 'No Name' 
    } 

}); 

var myBook = new Book(); 
myBook.set('id','87'); 
myBook.fetch({success: ioSuccess, error: ioFail}); 

在服务器端,获取呼叫URL/IO /书籍/ 87,其中 '87' 成为request.params枚举的一部分。

现在,如果ID不足以从数据库中检索单个书籍模型,该怎么办?如果从数据库检索书籍模型需要使用ID和发布者ID,该怎么办?

第一个解决办法是这样的URL将变为/ IO /书籍延长PARAMS /:ID /:的publisherId

但有人可以告诉我,主干采用这种设计如何适应?我已经试过以下没有成功:

var myBook = new Book(); 
myBook.set('id','87'); 
myBook.set('publisherid','34'); 
myBook.fetch({success: ioSuccess, error: ioFail}); 

此外,为了克服我的问题,我已经添加(成功)我额外的钥匙插入取功能的数据一部分变成了:

myBook.fetch({'data': {'publisherid':'34'}, {success: ioSuccess, error: ioFail}); 

但是我发现这个解决方案不够优雅,因为在服务器端,我最终得到了两个enumarators(request.params和request.query),我必须合并以获得我需要的所有密钥。

感谢, EBL

回答

2

您可以提供的模型自定义url方法和调整它以符合您的要求的终点。

例如,以符合您/io/books/:ID/:PublisherID片段,你可以定义你的类作为

var Book = Backbone.Model.extend({ 
    urlRoot : "/io/books", 

    // see http://backbonejs.org/docs/backbone.html#section-65 
    // for the source code 
    url: function() { 
     var base = _.result(this, 'urlRoot'); 
     if (this.isNew()) return base; 

     return base + 
      '/' + encodeURIComponent(this.id) + 
      '/' + encodeURIComponent(this.get('publisherid')); 
    }, 

    defaults : { 
     author : 'No Name' 
    } 
}); 

var myBook = new Book(); 
myBook.set('id', '87'); 
myBook.set('publisherid', '34'); 
myBook.fetch(); 

而小提琴与http://jsfiddle.net/nikoshr/8zS5a/

+0

极大的发挥。作品般的魅力。 –