【问题标题】:Sails.js: Best practice for calculating a model's attribute on api create?Sails.js:在 api create 上计算模型属性的最佳实践?
【发布时间】:2016-02-13 01:22:52
【问题描述】:

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

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

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

api/models/CalculatedData.js

module.exports = {

  attributes: {

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


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

  }
};

【问题讨论】:

    标签: sails.js


    【解决方案1】:

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

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

    或者你可以有一项服务来为你做这件事。虽然更好的方法是使用自定义模型方法来填充模型。

    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);
        }
    };
    

    编辑

    更好的方法是使用beforeCreate life-cycle callback

    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();
        }
    };
    

    【讨论】:

    • 假设我使用了您在答案中提供的代码 sn-p,我将如何从 create API 端点(由sails 生成)而不是默认的 create 方法调用它型号?
    • 嗯,您可以覆盖 blueprint create 方法,但这会覆盖所有模型。更好的方法可能是使用 beforeCreate 生命周期回调
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多