Sails.js:如果发布重复记录,则发送409响应

时间:2013-11-07 06:59:18

标签: sails.js

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

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

我假设我会覆盖BrandController中的create函数,根据req.param('id')搜索品牌,如果存在,则发送错误响应。但是我不确定我是否正确地做到了这一点,因为我似乎无法正常工作。

有人有想法吗?

3 个答案:

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

}

就是这样。我花了太长时间才弄明白这一点,但我认为这是一个很好的方法。

答案 1 :(得分:0)

好吧,因为这是MVC,你正在思考控件应该强制执行这个逻辑。但是,由于这是主要ID的基本唯一性,因此模型应该知道/理解并帮助强制执行此操作。

  1. 模型应该识别冲突。
    • 在风帆中,编码器负责定义唯一性,但我希望模型对象不是控制器。
  2. 控制器应该通过发送有效为http 409的视图来路由/响应。
    • 是的,在这种情况下应该使用控制器创建方法,因为sails想为您提供CRUD路由。假设这是一个逻辑创造而不是一些结果或奇怪的非宁静的副作用。
    • 我认为Sails.js默认提供模型控制器,因此在使用框架时请使用它们的透视图。控制/模型关系有很多种方法。
    • res.view([view,options [,fn]])
  3. 理想情况下,视图将控制http响应代码,消息,任何特殊的附加标头。这个观点恰好是非常基本的,但将来会有所不同。
    • 您始终可以使用控制器中的JSON设置标头和响应,但是视图将为您提供灵活性,例如解耦,MVC模式存在的原因。然而,帆似乎也很重视便利,所以如果它是一个小应用程序,可能直接来自控制器。

答案 2 :(得分:0)

我使用 action2 解决了这个问题,因为它是处理特定用例的干净方式,它很容易定义我们在请求中需要什么以及我们想要在 action2 中作为响应发送什么,这里是通过定义 exits.invalid 来解决您问题的代码示例带有您要发送的状态代码。

module.exports = {
  friendlyName: "Create",
  description: "Create User.",
  
  inputs: {
    id :{
      type : 'number',
    },
  },

  exits: {
    success:{
      statusCode: 200,
    },
    invalid:{
      statusCode: 409,
    },
  },
 
  fn: async function (inputs, exits) {

    var userData = await User.find( {id : inputs.id });
    if(!userData[0]){
      return exits.invalid({
        message: "custom message you can send from here",
      });
    }

    return exits.success({
      message: "User id is unique",
    });
  },
};

无效将发送json

{
message: "custom message you can send from here",
}

状态为 409 / 冲突