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 不会持续存在,即使它每次运行都会写入磁盘。

谢谢 ;)

4

1 回答 1

2

您在加载数据库之前就在使用它,并且基本上每次都从 0 开始。 module.exports立即运行,但load事件必须等待磁盘 io。
在从数据库中获取值之前,您必须等待文件被加载和解析。

自述文件

脏事件:'load'(长度)

数据库文件完成加载后发出。在此事件触发之前访问记录是不安全的。不过写记录应该没问题。

您可以删除该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 票。

于 2013-04-22T15:32:18.957 回答