redis Error : ERR wrong number of arguments for 'set' command

redis Error : ERR wrong number of arguments for 'set' command

我在本地 redis 服务器 (127.0.0.1:6379) 上使用 redis set 命令时出错

版本:

npm version : 2.15.0;
node version : 4.4.2;
nodejs verison : 0.10.25;
redis version : 2.7.1;

错误:

events.js:141 throw er; // Unhandled 'error' event
ReplyError: ERR wrong number of arguments for 'set' command at parseError 
(/opt/xxx/xxx/node_modules/redis/node_modules/redis 
parser/lib/parser.js:193:12) at parseType 
(/opt/xxx/xxx/node_modules/redis/node_modules/redis-
parser/lib/parser.js:303:14)

我所有的代码都是这样的:

redis.set("key","value")

在我的本地机器上代码是 运行 成功,但是在 aws linux 机器上我得到了这个错误。

var matchedMaps = map.get(publicURIField);
            if(matchedMaps) {
                matchedMaps.forEach(function(matchedMap){
                    var patternToValidate = matchedMap.pattern;
                    var type = matchedMap.type;
                    var tagID = matchedMap.tagID;
                    var patternToCheck = "cs-uri-stem";
                    var patternToSave = "";
                    if(type==1){
                        patternToCheck = "c-referrer";
                    }
                    var regexToFind = new RegExp(patternToValidate.substring(1,patternToValidate.length-1));
                    var matchedPattern;
                    if (regexToFind.test(rawLogParsed[patternToCheck].toString())) {
                        if (matchedMap.regexType=="&"){
                            matchedMap.patterns.forEach(function(patternObject){
                                var key = patternObject.pattern.split("=")[0];
                                var value = rawLogParsed[patternToCheck].toString().split(key)[1];
                                if(rawLogParsed[patternToCheck].toString().split(key)[1].split("&")){
                                    value = rawLogParsed[patternToCheck].toString().split(key)[1].split("&")[0];
                                }
                                patternToSave += key+value+"&";
                            });
                        }else{
                            matchedMap.patterns.forEach(function(patternObject){
                                if(patternObject.pattern.indexOf("*")>-1){
                                    patternObject.pattern = patternObject.pattern.replace(/\*!/g, '.*');
                                }
                                patternToSave += rawLogParsed[patternToCheck].toString().match(patternObject.pattern)+"/";
                            });
                        }
                        patternToSave = patternToSave.substring(0,patternToSave.length-1);
                        var matchedField = publicURIField,matchedPattern = patternToSave
                            ,key = tagID + "_"+userID+"_"+ matchedField + "_" + matchedPattern + "_" + type + "_" + fixedMinuteNumber;
                        if (tagUsageInfo[startKeyForRedis+key] == undefined) {
                            var tagObject = {
                                pattern:matchedPattern,
                                matchedField:matchedField,
                                userID:userID,
                                tagName:matchedMap.tagName,
                                monthNumber:parseInt(mMonthToCheck),
                                minuteNumber: parseInt(fixedMinuteNumber),
                                hourNumber: parseInt(yearMonthDayHourToCheck),
                                dayNumber: parseInt(yearMonthDayToCheck),
                                tagID: tagID,
                                matchedPattern: matchedPattern,
                                totalRequests: 1,
                                totalEgress: parseInt(bytes),
                                totalTransfered: parseInt(bytes),
                                totalRest: parseInt(totalWorld),
                                totalUS: parseInt(totalUS)
                            }
                            if(isIngress){
                                tagObject.totalIngres += parseInt(bytes);
                            }
                            dbclient1.set(startKeyForRedis+"tagUsage_"+key,JSON.stringify(tagObject));
                            tagUsageInfo[startKeyForRedis+"tagUsage_"+key] = startKeyForRedis+key;
                        }
                        else {
                            dbclient1.get(startKeyForRedis+"tagUsage_"+key, function(err, tagObject) {
                                var tagObjectJson = JSON.parse(tagObject);
                                tagObjectJson.totalRequests += 1;
                                tagObjectJson.totalEgress += parseInt(bytes);
                                tagObjectJson.totalTransfered += parseInt(bytes);
                                tagObjectJson.totalRest += parseInt(totalWorld);
                                tagObjectJson.totalUS += parseInt(totalUS);
                                tagObjectJson.totalRequests += 1;
                                if(isIngress){
                                    tagObject.totalIngres += parseInt(bytes);
                                }
                                dbclient1.del(startKeyForRedis+"tagUsage_"+key);
                                dbclient1.set(startKeyForRedis+"tagUsage_"+key, JSON.stringify(tagObjectJson));
                            });
                        }
                    }
                });
            }

有什么帮助吗?

all of my codes look like this: [...]

所有代码的外观并不重要。导致问题的特定行看起来很重要,但遗憾的是您没有包含它。

您提供的错误包括一些文件和行号,但您似乎删除了与代码相关的错误。如果您仔细阅读这些消息,那么您应该能够知道这些错误与哪些行相关并关注这些行。

如果错误出现在服务器上而不是您的桌面上,那么我怀疑您可能正在尝试使用文件系统上的某些环境变量或文件来填充程序中的某些变量,而这些是在服务器上不可用导致将 undefined 放在那里。

在每个要访问Redis的地方加上console.log()语句,先打印出来再调用Redis,你肯定会发现问题所在。这样至少您会知道是什么数据导致了问题。我怀疑您有一些 undefined 值或类似的值。

请记住 JSON.stringify(undefined) returns undefined 而不是有效的 JSON 字符串。类似的事情可能会导致问题。添加调试消息将有助于缩小范围。

一些额外的建议:您可以使用 redis 模块的 prefix 参数,这样您就不必到处添加 startKeyForRedis+。您可以设置一次前缀并自动将其添加到前面。查看文档:

1)如果您尝试 运行 redis on windows set 只接受两个参数导致 redis 版本问题

2) 在 linux 上尝试最新版本的 redis,它将工作

尝试从以下 link 在 windows 上安装此版本的 Redis。您可以在此处找到更多信息 https://github.com/ServiceStack/redis-windows

这个 link 提供了三个选项来在 windows

上安装 Redis

选项 1) 在 Ubuntu Windows

上安装 Redis

选项 2) 运行 最新版本的 Redis 与 Vagrant

选项 3) 运行 Microsoft 的 Redis 本地端口

我个人更喜欢选项3。 希望这有所帮助。谢谢

我正在学习使用 KUE 一个 nodejs 库来进行作业调度,它使用 redis 来保存数据。 我在 运行 client.js(将作业放入队列)和 worker.js(处理计划作业)时收到此错误。 在 运行 客户之前,我是 运行 工人,这就是发生这种情况的原因。 我颠倒了订单,一切顺利!

需要从 v.3 修复 windows Redis 上的此错误。 这就是为什么我从 here 获取压缩版本 3.0.504,现在一切正常。

很简单。

我遇到过类似类型的错误,这是因为旧版本的 Redis。这是兼容性问题,修复了 Redis 2.6.12 之后的一个错误。确保安装最新版本的 Redis v3.X.