executing sequent command in redis

This code doesn't work and I couldn't find out why? It is always pushing obj right serialized JSON string but it always return with wrong key. In obj id is regularly increasing but key isn't.

var c = redis.createClient(),
        obj = {id:0, name:"dudu"},
        key="person:";

c.select(0);

c.multi()
    .incr("idx:person", function(err, _idx) {
        console.log("incr -> #idx: " + _idx);
        key += obj.id = _idx;
        console.log("After Inc obj: " + JSON.stringify(obj));
    })
    .set(key, JSON.stringify(obj), function(err, _setResp) {
        console.log("set -> #_setResp: " + _setResp);
        console.log(JSON.stringify(ihale));
    })
    .get(key, function(er, _obj) {
        console.log("get -> " + key);
        if (er) {
            res.json(er);
        } else {
            console.log("Found: " + JSON.stringify(_obj));
            res.json(_obj);
        }
    })
    .exec(function(err, replies) {
        console.log("MULTI got " + replies.length + " replies");
        replies.forEach(function(reply, index) {
            console.log("Reply " + index + ": " + reply.toString());
        });
    });
c.quit();

enter image description here enter image description here enter image description here enter image description here enter image description here

In transaction mode command are grouped and passed to Redis . The Exec command execute code you passed . When you pass the key value to a the set command , there is no incremental key value on right of it.

For this kind of use, and if you still want have merged commands in one , script it In Lua:

local keyid = redis.call('INCR', 'idx:person')
local result = redis.call('SET', 'person:'..keyid,ARGV[1])
return 'person:'..keyid

for using it in a redis eval command :

eval "local keyid = redis.call('INCR', 'idx:person'); local result = redis.call('SET', 'person:'..keyid,ARGV[1]);return 'person:'..keyid" 0 "yourJSONObject"

this should work:

client.eval([ "local keyid = redis.call('INCR', 'idx:person'); local result = redis.call('SET', 'person:'..keyid,ARGV[1]);return result", 0,JSON.stringify(obj)  ], function (err, res) {
 console.log(res); // give the personID
});

You Can also use a Hash instead of a simple key in your example for separate id, name , and json object . Return the hash from the lua script will be like return it from a hset.

This worked:

c.INCR("idx:person", function(a,b) {
    obj.id = b;
    console.dir(obj);
    key = "pa:" + b;
    c.set(key, JSON.stringify(obj), function(err, _setResp) {
        console.log("set -> #_setResp: " + _setResp);
        console.log(JSON.stringify(obj));
        c.get(key, function(er, _obj) {
            console.log("get -> " + key);
            if (er) {
                res.json(er);
            } else {
                console.log("Found: " + JSON.stringify(_obj));
                res.json(_obj);
            }
        });
    });
});

enter image description here enter image description here

The way to do this is simple :) Event driven node is executing every part inside of previous one:

c.INCR("idx:person", function(a,b) {
    obj.id = b;
    key = "pa:" + b;
    c.set(key, JSON.stringify(obj), function(err, _setResp) {
        c.get(key, function(er, _obj) {
            if (er) {
                res.json(er);
            } else {
                res.json(_obj);
            }
        });
    });
});