Node-redis: TypeError:decrの読み取り専用プロパティ 'callback'に割り当てることができません

作成日 2016年06月23日  ·  6コメント  ·  ソース: NodeRedis/node-redis

  • バージョン:ノードredis 2.6.2
  • プラットフォーム:Ubuntu14.04のノード4.4.5
  • 説明
    redisで単純なオンラインカウンターをデクリメントしようとしているときに、このエラーが発生し続けます。
    TypeError: Cannot assign to read only property 'callback' of decr
    at RedisClient.internalSendCommandWrapper (/home/alex/node_modules/newrelic/lib/instrumentation/redis.js:76:22)
    at RedisClient.wrappedFunction [as internal_send_command] (/home/alex/node_modules/newrelic/lib/transaction/tracer/index.js:354:24)
    at RedisClient.(anonymous function).RedisClient.(anonymous function) (/home/alex/node_modules/redis/lib/commands.js:45:25)
    at Socket.eval (eval at <anonymous> (/home/alex/server2.js:2:52), <anonymous>:2456:12)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at Socket.emit (/home/alex/node_modules/socket.io/lib/socket.js:128:10)
    at Socket.onclose (/home/alex/node_modules/socket.io/lib/socket.js:425:8)
    at Client.onclose (/home/alex/node_modules/socket.io/lib/client.js:232:24)
    at Client.onerror (/home/alex/node_modules/socket.io/lib/client.js:213:8)

コードは次のとおりです。

    db.decr('online',function(err){
        if(err){
            console.log('DECREMENTING ONLINE NUMBER FAILED:');
            console.log(err);
        }
        console.log('DECREMENTING ONLINE NUMBER WAS SUCCESSFUL!');
    });

私はそれを複製することができないようですが、それは多くの人々がサイトにいるときにのみ起こります。 私と数人の友人だけがそれをテストしているとき、それは値をうまくインクリメントおよびデクリメントする仕事をしているようです。

ちなみに、コールバック関数がなくても(db.decr( 'online')だけ)発生するので、エラーがスローされるかどうかを確認するためにコールバックを追加しただけです。

繰り返しますが、コードはより多くの人が使い始めるまで正常に機能します。 たぶんそれは同時に.decrを実行しようとしていて、それを処理できないのでしょうか?

question

最も参考になるコメント

[email protected][email protected]この問題が発生しました。 newrelicを1.28.0に戻すと、問題が解決しました。

ただし、redis2.6.2とnewrelic1.28.3を使用すると問題なく動作します。

全てのコメント6件

ログで、db.get()呼び出しでも同様のエラーが発生することがあることに気づきました。

    TypeError: Cannot assign to read only property 'callback' of get
    at RedisClient.internalSendCommandWrapper (/home/alex/node_modules/newrelic/lib/instrumentation/redis.js:76:22)
    at RedisClient.wrappedFunction [as internal_send_command] (/home/alex/node_modules/newrelic/lib/transaction/tracer/index.js:354:24)
    at RedisClient.(anonymous function).RedisClient.(anonymous function) (/home/alex/node_modules/redis/lib/commands.js:45:25)
    at eval (eval at <anonymous> (/home/alex/server2.js:2:52), <anonymous>:2384:16)
    at checkLogin (eval at <anonymous> (/home/alex/server2.js:2:52), <anonymous>:572:13)
    at Socket.eval (eval at <anonymous> (/home/alex/server2.js:2:52), <anonymous>:2001:9)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at Socket.onevent (/home/alex/node_modules/socket.io/lib/socket.js:335:8)
    at Socket.onpacket (/home/alex/node_modules/socket.io/lib/socket.js:295:12)

コード:

            db.get('triviaAnswer',function(err,dbAnswer){
                if(err){
                    console.log('Error getting triviaAnswer from redis: '+err);
                    return;
                }

また、「online」フィールドと「triviaAnswer」フィールドはすでに設定されており、上記のコードは次のように機能します。 これも「新しい」コードではなく、別のサーバーで数週間動作しているので、問題があるのではないかと思います。

これはnewrelicの問題のようですので、これについて彼らに連絡することをお勧めします。 私はnewrelicを自分で使用していないので、これ以上お役に立てず申し訳ありません。

以上、ありがとうございます。

@Alchemystic修正について詳しく説明して 2.6.2(2.6.0-1から)にアップグレード

newrelicの使用をやめました。 ネットワークの問題を診断するためだけに入手しましたが、問題の原因であることがわかった後、削除しました。

[email protected][email protected]この問題が発生しました。 newrelicを1.28.0に戻すと、問題が解決しました。

ただし、redis2.6.2とnewrelic1.28.3を使用すると問題なく動作します。

このページは役に立ちましたか?
0 / 5 - 0 評価