2017-10-10 90 views
0

Keystone和mongo对我来说都是新手,所以我不确定如何操作数据。如何在将数据存储到Keystone JS中的数据库之前进行更改

我有具有模型(/models/Game.js),看起来像一个梯形列表:

var keystone = require('keystone'); 
var Types = keystone.Field.Types; 

var Game = new keystone.List('Game'); 

Game.add({ 
    odds: { type: Types.Text, required: true, initial: true}, 
}); 

Game.track = true; 
Game.defaultSort = '-createdAt'; 
Game.defaultColumns = 'odds'; 
Game.register(); 

赔率字段是一个字符串,例如3/1,我希望通过拆分,并返回一个小数点的版本,例如一个函数来运行此:

function decimalOdds(fraction) { 
    const splitFields = fraction.split('/'); 
    return ((splitFields[0]/splitFields[1]) + 1).toFixed(2); 
} 

这是我想被存储在该公司的赔率“该函数的返回值数据库。那可能吗?

回答

2

您可以使用预先保存钩:

Game.schema.pre('save', function(next) { 
    if (this.isModified('odds')) { 
    this.odds = decimalOdds(this.odds) 
    } 
    next() 
}) 

你可以阅读更多的架构插件的文档的部分: http://keystonejs.com/docs/database/#lists-plugins

您也可以找到关于猫鼬架构挂钩的更多信息这里: http://mongoosejs.com/docs/middleware.html

+0

谢谢!读过Keystone模式文档并测试了几件事情后,我注意到,如果使用'Post.schema.methods.decimalOdds = function(fraction){...}'与this.decimalOdds(this.odds)结合使用它没有任何区别)'或者我只是定义了一个像'function decimalOdds(fraction){...}'这样的普通函数,并通过'decimalOdds(this.odds)'调用它。这两种方法有什么区别? – davidpauljunior

+1

没问题。创建Mongoose实例方法将允许您在具有模型实例的任何地方使用该方法,因此,如果要在应用程序中的其他位置使用模型并且需要该功能,这可能会很有用。 –

+0

太棒了。对不起,最后一件事(意外地延长我的问题一点点)。如果你有多个'pre'钩子,它们都可以在同一个'Game.schema.pre'中吗?还是每个都有这个整块? – davidpauljunior

相关问题