我正在努力使用aerospike nodejs模块,我想要实现的目标如下:
asdAbstractedModule.update(config, [foo, bar, ...]);
这背后的想法是使用now()时间戳更新foo,bar等。 但是,airospike客户端的工作方式使得这种方式很难或者可能不是很直接。这是我到目前为止所得到的:
const aerospike = require("aerospike");
const config = require("./config");
let errors = 0;
let invalid = [];
let client;
let app = {};
app.update = function(objects, cb, configObj) {
errors = 0;
invalid = [];
if (!client) {
if (configObj && typeof configObj === "object")
client = aerospike.client(configObj);
else
client = aerospike.client(config.aerospike);
}
if (client.isConnected(false)) {
execUpdate(objects, cb);
}
else {
client.connect(function (err) {
if (err) {
return cb(err);
}
execUpdate(objects, cb);
});
}
};
function execUpdate(objects, cb) {
validate(objects, function(err) {
if (err)
return cb(err);
updateObject(objects, function(err) {
if (err)
return cb(err);
if (invalid.length > 0)
return cb(`Invalid objects: ${invalid.join(",")}`);
return cb();
});
});
}
function validate(objects, cb) {
if (!Array.isArray(objects))
return cb("Objects should be provided as an array");
let valid = config.validObjects;
for (let i=0; i < objects.length; i++) {
if(valid.indexOf(objects[i]) === -1)
invalid.push(objects[i]);
}
cb();
}
function updateObject(objects, cb) {
let doc = {};
let ts = Math.round(new Date().getTime() / 1000);
for(let i = 0;i<objects.length;i++)
doc[objects[i]] = ts;
let key = new aerospike.Key("namespace", "set", "timestamps");
client.put(key, doc, function(err) {
if (err) {
if (errors > config.errorThreshold) {
return cb(err);
}
else {
return updateObject(objects, cb);
}
}
else {
cb();
}
});
}
process.on("beforeExit", function() {
client.close();
});
module.exports = app;
但你可以说这是非常有限的,例如你只能初始化一次,而且它是在更新方法中完成的? (可能是可以猜到的)。此外,您无法控制客户端,实际上可以正常运行。
也许最好从需要的代码传递客户端,我明白这可能看起来不错,但我需要在很多地方做这件事,事实上有几个回购。
我的目标是将此作为我可以要求的模块,并传递我需要更新的参数。这个回购将继续运行。
现在我已经在一个仓库中实现了这个,我发现客户端在刷新时失败了,可能在汇集服务器时,还需要解决这个问题。
我不确定实现这个目标的最佳途径是什么