首页 > 解决方案 > 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 中实现了这一点,我看到客户端在刷新时失败,也许在池化服务器时,仍然需要解决这个问题。

我不确定实现这一目标的最佳方法是什么

标签: node.jsaerospike

解决方案


推荐阅读