2014-01-20 47 views
2

我正在开发我的第一个nodejs/backbone项目。我需要做的是用其他方法扩展用户模型API。由于REST使用通用的post/get/put请求,您如何将骨干模型与其他api调用扩展(即阻止用户帐户,我不想更新用户并使用/禁用/停用url)?骨干模型 - 扩展api调用

我可以采取丑陋的路线,但我寻找专业人士的“正确的方式”。

我骨干模型

define(["jquery", "backbone"], 
function($, Backbone) { 
    var User = Backbone.Model.extend({ 
     urlRoot: '/user', 

     defaults: { 
      username: '', 
      password: '', 
      email: '' 
     } 
    }); 
    return User; 
} 
); 

我的NodeJS “路由器”

app.put('/user', userController.register); 
    app.post('/user', userController.update); 
    app.get('/user', userController.list); 
    app.delete('/user', userController.delete); 

回答

2

为什么不加挡,并关闭属性模型,然后用标准的REST/CRUD API调用。

然后,您的操作阻止并停用只是标准模型更新,其逻辑处理API方法中被阻止和活动的模型状态。

define(["jquery", "backbone"], 
function($, Backbone) { 
    var User = Backbone.Model.extend({ 
     urlRoot: '/user', 

     defaults: { 
      username: '', 
      password: '', 
      email: '', 
      blocked: false, 
      active: true 
     }, 

     block: function() { 
      this.set('blocked', true); 
      this.save(); 
     }, 

     deactivate: function() { 
      this.set('active', false); 
      this.save(); 
     }, 

    }); 
    return User; 
} 
); 

编辑 - 基于您的评论,需要更新

如果您需要在服务器上更新领域区分区分,以便运行路线特定的验证为例。然后,您可能需要为每个特定操作调用自定义路由。一个简单的方法是在保存模型的过程中重写URL。

更新的模型示例。

define(["jquery", "backbone"], 
function($, Backbone) { 
    var User = Backbone.Model.extend({ 
     urlRoot: '/user', 

     defaults: { 
      username: '', 
      password: '', 
      email: '', 
      blocked: false, 
      active: true 
     }, 

     block: function() { 
      this.set('blocked', true); 
      this.save(this, { url: '/user/block' }); 
     }, 

     deactivate: function() { 
      this.set('active', false); 
      this.save(this, { url: '/user/deactivate' }); 
     }, 

    }); 
    return User; 
} 
); 

然后,你将有以下途径

app.put('/user', userController.register); 
app.post('/user', userController.update); 
app.get('/user', userController.list); 
app.delete('/user', userController.delete); 
app.post('/user/block', userController.block); 
app.post('/user/deactivate', userController.deactivate); 
+0

得到了点,但是这也意味着我所有的“自定义API方法”将指向“app.post(‘/用户’.. 。“这就是说,在服务器端,我有一个入口点用于多个场景/范围。例如 - 用户电子邮件更新,密码更改(带有双字段确认)和用户停用只会将不同的字段发布到相同的api方法(没有明确的含义) – spamec

+0

然后你可以通过你想要命中的路线作为模型中的一个选项,例如this.save(this,{url:'/ user/block'}) –