2017-10-10 91 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

相關問題