gpt4 book ai didi

javascript - Node 脏在运行过程中不会持续存在

转载 作者:行者123 更新时间:2023-12-02 18:48:48 25 4
gpt4 key购买 nike

我有以下模块:

// 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}

首先,如果有人能解释仅附加策略,那就太好了。其次,我想了解为什么 Node 脏即使每次运行都会写入磁盘,也不会持续存在。

谢谢;)

最佳答案

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

来自readme :

dirty event: 'load' (length)

Emitted once the database file has finished loading. It is not safe to access records before this event fires. Writing records however should be fine.

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

关于javascript - Node 脏在运行过程中不会持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16055760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com