Sails.js:添加自定义实例方法结果作为模型属性

我对JavaScript编程相对来说比较新,所以这个问题可能有一个小小的解决scheme。 使用Sails.js,我创build了这个模型。

module.exports = { tableName: 'FOO_TABLE', attributes: { FOO: 'string', BAR: 'number', BAR2: function() { return this.BAR + 1; } }, }; 

然后,在一个控制器中,我得到所有的实例:

 FOO_MODEL.find().exec(function(err, FOOS) { return res.view({data: JSON.stringify(FOOS)}); }); 

问题是,在FOOS内部,这不是BAR2方法。 我已经使用了这个解决scheme(使用Underscore.js):

 FOOS = _.map(FOOS, function(FOO){ FOO.BAR2 = FOO.BAR2(); return FOO; }); 

但是我不认为它是有效的/聪明的,因为我想我可能会再次发现这个问题。 你会怎么做? 谢谢

如果你想要为每个新实例设置一个计算值,你可以设置BAR2为模型中的typesnumber (而不是函数),并添加一个beforeCreate类的方法,如:

 beforeCreate: function(values, cb) { values.BAR2 = values.BAR + 1; return cb(); } 

如果要将BAR2作为实例方法保留,但要将其与对象一起序列化,则可以覆盖默认的toJSON实例方法:

 toJSON: function() { var obj = this.toObject(); obj.BAR2 = obj.BAR2(); return obj; } 

任何时候一个实例被string化,它的toJSON方法将被调用。

检查您的查询结果

如果你在请求期间调用你的实例方法,也就是在查询callback中,你可能想要检查你传入的结果。

在我的情况下,我正在使用帆/水线ORM模型方法, find而不是findOne (如骨头),其实际上是一个集合( 数组 )。 所以我尝试了一下:

[ {...} ].hasItem(id)

…而我需要的是这样的:

myQueryResults[0].hasItem(id)

或者说,使用findOne正确查询。 白痴似乎是一个不好的做法,但是我猜想。

希望这个帮助!