Sails.js:计算模型的最佳实践&x27;api上的属性创建?

Sails.js:计算模型的最佳实践&x27;api上的属性创建?,sails.js,Sails.js,假设我有以下模型,那么在Sails.js中,从createapi调用上的一个或多个非持久性属性计算sum属性的最佳实践是什么 在此示例中,我希望扩展此模型API的默认创建行为,以接受附加属性valueOne和valueTwo,然后基于简单的valueOne+valueTwo计算sum属性 理想情况下,不丢失模型上其他字段的开箱即用验证,例如name,但不要求在API级别提交sum,同时模型本身仍然需要 api/models/CalculatedData.js module.exports = {

假设我有以下模型,那么在Sails.js中,从createapi调用上的一个或多个非持久性属性计算
sum
属性的最佳实践是什么

在此示例中,我希望扩展此模型API的默认创建行为,以接受附加属性
valueOne
valueTwo
,然后基于简单的
valueOne+valueTwo
计算
sum
属性

理想情况下,不丢失模型上其他字段的开箱即用验证,例如
name
,但不要求在API级别提交
sum
,同时模型本身仍然需要

api/models/CalculatedData.js

module.exports = {

  attributes: {

    name: {
      type: 'string',
      required: true
    },


    sum: {
      type: 'integer',
      required: true
    }

  }
};

有很多方法可以做到这一点

如果填充此模型的控制器只有一个,则可以计算控制器中的总和,并将结果传递给模型创建方法

或者你可以找一个服务来帮你。尽管更好的方法是使用自定义模型方法填充模型

module.exports = {
    attributes: {
        // your attributes
    },

    customCreate: function (options, cb) {
        options.sum = options.values.reduce(function (a, b) {
            return a + b;
        });

        delete options.values;
        Model.create(options).exec(cb);
    }
};
编辑 更好的方法是在创建之前使用


假设我使用了您在回答中提供的代码片段,我将如何从create API端点(由sails生成)调用它,而不是在模型上调用默认的create方法?嗯,您可以覆盖blueprint create方法,但这将覆盖所有模型。更好的方法可能是使用beforeCreate生命周期回调
module.exports = {
    attributes: {
        // your attributes
    },

    beforeCreate: function (options, cb) {
        options.sum = options.values.reduce(function (a, b) {
            return a + b;
        });

        delete options.values;
        return cb();
    }
};