骨干模型 - 扩展api调用

时间:2014-01-20 13:35:53

标签: javascript node.js backbone.js express

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

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

我的骨干模型

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

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

我的nodejs“router”

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

1 个答案:

答案 0 :(得分: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);