2013-04-17 30 views
0

我有以下模塊:節點髒不從運行持續運行

// vote.js 
var db = require(./dirty-wrapper); 

module.exports = function vote() { 

    var obj = {}; 

    // increase the score 
    obj.inc = function(key) { 
    var pval = db.get(key); 
    if (!pval) pval = 0; 
    db.set(key, pval + 1); 
    }; 

    // decrease the score 
    obj.dec = function(key) { 
    var pval = db.get(key); 
    if (!pval) pval = 0; 
    db.set(key, pval - 1); 
    }; 

    // reset the score to 0 
    obj.reset = function(key) { 
    db.set(key, 0); 
    }; 

    obj.get = function(key) { 
    return db.get(key); 
    }; 
    return obj; 
}; 

其使用骯髒這個簡單的包裝:

// dirty-wrapper.js 
var dirty = require('dirty'); 
var db = dirty('vote.db'); 


module.exports = db.on('load', function() { 

    var obj = {}; 


    obj.set = function(key, val, callback) { 
    db.set(key, val); 
    return callback(); 
    }; 


    obj.get = function(key, callback) { 
    return callback(db.get(key)); 

    }; 

    obj.reset = function(callback) { 
    db.forEach(function(key, val) { 
    val = 0; 
    }); 
    return callback(); 
    }; 
    return obj; 
}); 

,這是我簡單的客戶端:

// client.js 
var vote = require('./vote.js')(); 

vote.inc('michael'); 
vote.inc('michael'); 
vote.inc('michael'); 
vote.inc('michael'); 

console.log('michael: ' + vote.get('michael')); // output = michael: 4 

問題是,當運行停止時,我再次啓動客戶端,輸出是michael: 4

第二次運行後,vote.db包含以下內容:

$ cat vote.db 
{"key":"michael","val":1} 
{"key":"michael","val":4} 
{"key":"michael","val":4} 
{"key":"michael","val":4} 
{"key":"michael","val":1} 
{"key":"michael","val":4} 
{"key":"michael","val":4} 
{"key":"michael","val":4} 

首先,將是巨大的,如果有人可以解釋append-only策略。其次,我想了解爲什麼node-dirty即使每次運行寫入磁盤都不會持續存在。

感謝;)

+0

我想我在這裏混合了'sync'和'async'功能,它會導致一些問題,只是不確定這裏的經驗法則是什麼 – Michael

回答

2

您正在使用的數據庫之前,它已載入,基本上每次都從0開始。 module.exports立即運行,但load事件必須等待磁盤io。
你必須等待文件被加載和解析,然後才能從數據庫獲取值。

readme

髒事件: '負載'(長度)

一旦數據庫文件完成加載觸發。在事件發生之前訪問記錄是不安全的。但是寫入記錄應該沒問題。

您可以刪除dirty-wrapper文件,只需使用vote作爲包裝。對使用方式做一個小改動,記住你必須等待加載事件。

您的投票界面:

// vote.js 
var events = require('events'); 
var dirty = require('dirty'); 
var db = dirty('vote.db'); 

var obj = new events.EventEmitter(); 

// increase the score 
obj.inc = function(key) { 
    var pval = db.get(key); 
    if (!pval) pval = 0; 
    db.set(key, pval + 1); 
}; 

// decrease the score 
obj.dec = function(key) { 
    var pval = db.get(key); 
    if (!pval) pval = 0; 
    db.set(key, pval - 1); 
}; 

// reset the score to 0 
obj.reset = function(key) { 
    db.set(key, 0); 
}; 

obj.get = function(key) { 
    return db.get(key); 
}; 

db.on('load', function() { 
    obj.emit('load'); 
}); 

module.exports = obj; 

而且你的主腳本:

// client.js 
var vote = require('./vote.js'); 

vote.on('load', function() { 

    vote.inc('michael'); 
    vote.inc('michael'); 
    vote.inc('michael'); 
    vote.inc('michael'); 

    console.log('michael: ' + vote.get('michael')); // output = michael: 4 

}); 

這將輸出4個票每次運行。

+0

謝謝!我想保留骯髒的包裝,所以我可以維護一個單一的界面,如果我想切換到其他數據庫。我會試驗一下並嘗試一下。 – Michael