【问题标题】:Error using Redis Multi with nodejs将 Redis Multi 与 nodejs 一起使用时出错
【发布时间】:2021-02-22 01:08:45
【问题描述】:

我正在使用 Redis 并从 nodejs 咨询它,使用模块 Redis。

当我执行 client.multi() 并且 redis 服务器关闭时,回调不会发送错误并且 nodejs 应用程序终止。 这是错误

    /Users/a/db/node_modules/redis/index.js:151
                    throw callback_err;
                          ^
TypeError: Cannot read property 'length' of undefined
    at Command.callback (/Users/a/db/node_modules/redis/index.js:1098:35)
    at RedisClient.flush_and_error (/Users/a/db/node_modules/redis/index.js:148:29)
    at RedisClient.on_error (/Users/a/db/node_modules/redis/index.js:184:10)
    at Socket.<anonymous> (/Users/a/db/node_modules/redis/index.js:95:14)
    at Socket.EventEmitter.emit (events.js:95:17)
    at net.js:441:14
    at process._tickCallback (node.js:415:13)

这是我的代码: 构造函数类

var redis = require('redis');
var client;
function Redis(){
    client = redis.createClient();
    client.on("error", function (err) {
        console.log("Error " + err);
    });
}

Redis.prototype.multi =  function(commands,callback){
    var err = null;
    client.multi(commands).exec(function (error, res) {
        if(error){
            process.nextTick(function(){
                callback(error,null)
            })
        }else{
            process.nextTick(function(){
                callback(null,res)
            })
        }
    });
}

【问题讨论】:

  • commands 是一个带有子数组的数组吗?如果不是,你有没有尝试捕捉这种情况?这是commands 的样子:[ ["mget", "multifoo", "multibar", redis.print], ["incr", "multifoo"] ]
  • commands 是一个数组,当 redis 启动时,我收到所有结果,当服务器关闭时,我收到错误

标签: node.js redis


【解决方案1】:

仅供参考,我在一个依赖旧版本 node_redis 的旧库中遇到了这个问题。

此问题是一个错误,已在 v0.9.1 中修复 - 2013 年 11 月 23 日:https://github.com/mranney/node_redis/pull/457

【讨论】:

  • 这发生在我的 node-redis v2.6.2 上。不是每次,而是偶尔,但很少打电话。我几个小时都没有得到回复。
【解决方案2】:

我认为人们仍在到达这里......(不确定这是否直接回答了这个特定问题,但我假设人们到达这里,因为 multi.exec() 返回 true / 事件循环没有等待它的响应.

在(在 node-redis 中)进行修复之后,可以使用 Promise 包装 exec 的结果,然后您将确保结果将包含来自 multi 的回复。

所以,你可以在multi中添加一些redis命令:

await multi.exists(key);
await multi.sadd(key2,member);

然后在结果中执行以下操作:

    return new Promise((resolve, reject) => {
        multi.exec((err, replies) => {
            if (err) {
                reject(err);
            }
            return resolve(replies);
        });
    });

否则,如果你只是这样做:const reply = await multi.exec(); 它只会让你返回真实,而不是回复

** 需要提一下 - 这指的是 'async-redis' 和 'node-redis'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多