Aerospike,NodeJs模块,抽象客户端

时间:2018-05-02 18:50:31

标签: node.js aerospike

我正在努力使用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;

但你可以说这是非常有限的,例如你只能初始化一次,而且它是在更新方法中完成的? (可能是可以猜到的)。此外,您无法控制客户端,实际上可以正常运行。

也许最好从需要的代码传递客户端,我明白这可能看起来不错,但我需要在很多地方做这件事,事实上有几个回购。

我的目标是将此作为我可以要求的模块,并传递我需要更新的参数。这个回购将继续运行。

现在我已经在一个仓库中实现了这个,我发现客户端在刷新时失败了,可能在汇集服务器时,还需要解决这个问题。

我不确定实现这个目标的最佳途径是什么

0 个答案:

没有答案