Redis-node库丢弃事务

Redis-node library discard transactions

实际上我正在使用优秀的库 redis-node。 但是,我不知道如何使以下情况起作用:

我有一个参数传递的数量字段,然后,在for循环中,我需要使用LPOP从第一个列表中提取项目,然后RPUSH到另一个列表中,数量必须相同,所有在交易块内。

所以,如果数量参数和提取的项目不同,我不想丢弃交易,这可能吗?

我放了一段我现在的代码。

var redisNode = require('redis-node');
var client = redisNode.createClient();
var qty = req.params.qty;

// init transaction, lpop first and rpush finally
client.transaction(function () {
   for (var i=0; i <= qty; i++) {
       client.lpop(initStockListKey, function (err, item) {                        
           if (err) throw err;
           console.log('[assign] CREATE TRANSACTION list %s, pop %s', initStockListKey, item);  
           inProgressItems.push(item);
       });
   }

   // pop qty validation, DISCARD
   if (inProgressItems.length != qty) {
       client.discard(function (err, status) {
           console.log('[assign] DISCARD TRANSACTION err %s status %s', err, status);  
       })
   }       
});

我有以下错误运行这段代码:

ERR EXEC without MULTI

您没有以正确的方式使用 MULTI。检查图书馆 GitHub repository 中的以下 node_redis 文档示例:

var redis  = require("redis"),
    client = redis.createClient(), multi;

// start a separate multi command queue
multi = client.multi();
multi.incr("incr thing", redis.print);
multi.incr("incr other thing", redis.print);

// runs immediately
client.mset("incr thing", 100, "incr other thing", 1, redis.print);

// drains multi queue and runs atomically
multi.exec(function (err, replies) {
    console.log(replies); // 101, 2
});

// you can re-run the same transaction if you like
multi.exec(function (err, replies) {
    console.log(replies); // 102, 3
    client.quit();
});

在 Redis 中,EXEC 标志着由 MULTI 开始的原子操作的结束。