2013-04-17 2 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.
Вам нужно подождать, пока файл будет загружен и проанализирован, прежде чем вы получите значения из db.

От 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

Спасибо! Я хотел бы сохранить грязную упаковку, чтобы я мог поддерживать один интерфейс, если я хочу переключиться на другой db. Я немного экспериментирую и попробую. – Michael

Смежные вопросы