node.js - Aerospike,NodeJs 模块,抽象客户端
问题描述
我正在努力使用 aerospike nodejs 模块,我想要实现的是以下内容:
asdAbstractedModule.update(config, [foo, bar, ...]);
这背后的想法是使用 now() 时间戳更新 foo、bar 等。但是 aerospike 客户端的工作方式使这有点困难,或者可能不是很直接。这是我到目前为止得到的:
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;
但是你可以说这是非常有限的,例如你只能初始化一次,并且它是在更新方法中完成的?(可能有问题)。此外,您对客户端没有任何控制权,这实际上可以。
也许最好从需要的代码中传递客户端,我知道这似乎是一个坏主意,但我需要在很多地方这样做,实际上是几个 repos。
我的目标是将它作为我可以要求的模块,并传递我需要更新的参数。这个 repos 将持续运行。
现在我已经在一个 repo 中实现了这一点,我看到客户端在刷新时失败,也许在池化服务器时,仍然需要解决这个问题。
我不确定实现这一目标的最佳方法是什么
解决方案
推荐阅读
- android - 如何使用 Glide 播放 gif
- javascript - 玩 Babel-jest 不编译父文件夹中的 js
- java - 如何在 Reactor Netty 中处理 io.netty.channel.ConnectTimeoutException
- linux - 如何在没有日期和时间的情况下重命名文件
- selenium - 如何在 Jenkins 工作中使用 Selenium WebDriver?
- react-native - undefined 不是一个对象(评估 '(0 _reactnavigation.DrawerNavigator)')
- testing - Testcafe 连接到开发 URL 的速度非常慢
- docker - 可用磁盘空间低于阈值。可用:0 字节 docker 容器
- qt - Qt - 为 QTextEdit 设置特定/固定的字符宽度
- css - 如何为按钮中的大纲编写 CSS,因为 class="btn btn-outline-primary" 不起作用?