0

不确定如何在sails.js 中执行此操作,但我希望能够在API 上创建新对象时,检查该对象的ID 是否存在,如果存在,发送409 冲突响应,并且如果没有,请像平常一样创建对象。

为了便于讨论,我创建了一个品牌模型。

我假设我将覆盖 BrandController 中的 create 函数,根据品牌搜索,req.param('id')如果存在,则发送错误响应。但我不确定我是否正确执行此操作,因为我似乎无法得到任何工作。

有人有想法吗?

4

2 回答 2

3

我最终为这个特定的用例使用了一个策略。

在 下config/policies,我创建了一个 isRecordUnique 策略:

/**
 * recordIsUnique
 *
 * @module      :: Policy
 * @description :: Simple policy to check that a record is unique
 *               
 * @docs        :: http://sailsjs.org/#!documentation/policies
 *
 */

module.exports = function(req, res, next) {

    Brand.findOne({ id: req.body.id}).done(function (err, brand) {

        if (brand) {
            res.send(409);
        } else {
            next();
        }

    });

};

这使我能够避免覆盖任何 CRUD 函数,并且它似乎符合策略的定义,因为它只检查一件事。

为了将我的策略与我的创建功能联系起来,我config/policies通过添加以下内容进行了修改:

BrandController: {

    create: 'isRecordUnique'

}

而已。我花了很长时间才弄清楚这一点,但我认为这是一个好方法。

于 2013-11-09T02:09:10.620 回答
0

好吧,因为这是 MVC,所以您正确地认为 Control 应该执行此逻辑。但是,由于这是主要 id 的基本唯一性,模型应该知道/理解并帮助执行这一点。

  1. 模型应该识别冲突。
    • 在sails 中,编码器负责定义唯一性,但我会让模型对象而不是控制器来做。
  2. 控制器应该通过发送实际上是 http 409 的视图来路由/响应。
    • 是的,在这种情况下应该使用控制器创建方法,因为sails 想要为您提供 CRUD 路线。假设这是一个合乎逻辑的创建,而不是一些结果或奇怪的不平静的副作用。
    • 我认为 Sails.js 默认提供模型控制器,所以使用他们的视角,因为您正在使用他们的框架。控制/模型关系有很多方法。
    • res.view([视图, 选项[, fn]])
  3. 理想情况下,视图将控制 http 响应代码、消息、任何特殊的附加标头。该视图恰好是非常基本的,但将来可能会有所不同。
    • 您始终可以使用控制器中的 JSON 设置标头和响应,但视图在未来为您提供了灵活性,例如解耦,这就是 MVC 模式存在的原因。然而,sails 似乎也很看重便利性,所以如果它是一个小应用程序,可能直接来自控制器。
于 2013-11-07T07:18:44.367 回答