使 Node.js Redis 客户端的 .multi() 和 .batch() 在结果中返回错误以进行测试

Posted

技术标签:

【中文标题】使 Node.js Redis 客户端的 .multi() 和 .batch() 在结果中返回错误以进行测试【英文标题】:Make Node.js Redis client's .multi() and .batch() return errors in results for testing purposes 【发布时间】:2017-08-30 05:01:32 【问题描述】:

我可以从 Node.js Redis 客户端读取docs:

如果您的代码包含语法错误,则会引发 EXECABORT 错误,并且将中止所有命令。该错误包含一个包含具体错误的 .errors 属性。如果所有命令都已成功排队,并且 redis 在处理命令时抛出错误,则错误将在结果数组中返回!除了一次失败之外,没有其他命令会被中止。

如何编写 Node.js Redis 客户端的 .multi().batch() 以便在测试结果中出现错误?

【问题讨论】:

【参考方案1】:

不确定它是否仍然与您相关,但以下代码会为 MULTI 产生 EXECABORT 错误。 PS。我不是 nodejs 开发者:)

代码

var redis = require("redis"),
client = redis.createClient();
client.sadd("bigset", "a member");
client.sadd("bigset", "another member");
set_size = 20;

while (set_size > 0) 
    client.sadd("bigset", "member " + set_size);
    set_size -= 1;


// multi chain with an individual callback
client.multi()
    .scard("bigset")
    .smembers("bigset")
    .set("a")
    .keys("*", function (err, replies) 
        // NOTE: code in this callback is NOT atomic
        // this only happens after the the .exec call finishes.
        client.mget(replies, redis.print);
    )
    .dbsize()
    .exec(function (err, replies) 
//        console.log("MULTI got " + replies.length + " replies");
  //      replies.forEach(function (reply, index) 
//            console.log("Reply " + index + ": " + reply.toString());
    //    );
        console.log(replies);
        console.log(err);
        client.quit();
    );

输出

未定义

[ReplyError: EXECABORT Transaction 被丢弃,因为之前 错误。] 命令:'EXEC',代码:'EXECABORT',错误:[ [ReplyError: ERR 'set' 命令的参数数量错误] 命令: 'SET',参数:[对象],代码:'ERR',位置:2 ]

说明:SET 命令有 2 个参数。我只给了一个并将错误打印到控制台。

有关该主题的详细说明在this 问题中。请参阅 BridgeAR 的最后一条评论。

取自nodejs git repo的示例代码

【讨论】:

以上是关于使 Node.js Redis 客户端的 .multi() 和 .batch() 在结果中返回错误以进行测试的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:关闭所有 Redis 客户端

express,用于浏览器客户端和 node.js 客户端的 socket.io 服务器

来自连接到 Node.js API 的移动客户端的社交身份验证

带有 Node.js 后端的移动应用程序 - 为客户端开发选择啥框架?

如何在node js中配置redis客户端

Node.js:关闭时关闭所有Redis客户端