使用网络和nodejs堆叠字符串

时间:2017-12-01 16:55:29

标签: node.js sockets redis node-redis

我遇到了redis问题,文档对我来说并不清楚,我尝试制作简单堆栈的所有努力都出错了。

我使用nodejs作为服务器,redissocket一起使用我需要列出特定类型的用户,他们与房间之间的关系是多对多的,像这样:

MEMBERS <-----> ROOMS

有几个成员可能在几个房间,有几个房间可能有几个成员。

所有这些信息都在内存中分配,它带来了很多不必要的重量,因此使用redis管理这些类型的连接的想法。

在我的代码中,我这样做:

像这样启动服务:

const io = require ('socket.io'). listen (http);
const redisSocket = require ('socket.io-redis');
const redis = require ("redis");

我在socket

中获得了连接
io.sockets.on ('connection', (socket) => {my _functions});

我进入socket.on我需要与之合作的成员

socket.on ('ioUpdateLocation', (data) => {
    // Send the location to the devices in the room
    io.sockets.to (data.room) .emit ('ioReceiveLocation', date);
    addRoom (data.room, socket.id);

    // Emits the location for line X destination Y
    io.sockets.to (data.room + data.destiny) .emit ('ioReceiveLocation', data);
    addRoom (data.room + data.destiny, socket.id);
});

所以我打算把那个插座放在房间里这样:

const addRoom = (room, socketId) => {
    console.log ('room% s socket% s', room, socketId);

    redisClient.lpush (room, socketId, function (err, reply) {
        console.log ('err', err); // prints 2
        console.log ('reply', reply); // prints 2
    });
  }

我的想法是这样的:

ROOMS | MEMBERS
123 | ['member01', 'member02', 'member03']
123A | ['member01']

所以使用redis我希望来自会议室的addremove成员,以及check如果该成员在会议室中,例如X.

业务规则

  1. 会员可以在几个房间
  2. 房间不能有2个相同的成员
  3. 尝试了:

    1- client.set ();
    2- client.hmset ();
    3- client.rpush ();
    4- client.sadd ();
    

    没有成功。首先它取代了示例中的值,看起来像这样(在以下顺序中插入了相同的值member01,member02,member03):

    ROOMS | MEMBERS
    123 | 'member04'
    123A | 'member01'
    

    在尝试2,3,4中,结果是错误:

      

    {ReplyError:WRONGTYPE对一个持有错误值的键的操作       在新的命令(/var/www/lb-api-geolocation/node_modules/redis/lib/command.js:12:22)       在RedisClient.lpush(/var/www/lb-api-geolocation/node_modules/redis/lib/commands.js:58:47)       在addRoom(/var/www/lb-api-geolocation/src/socket/connect.js:144:17)       在Socket。 (/var/www/lb-api-geolocation/src/socket/connect.js:94:9)       在emitOne(events.js:115:13)       在Socket.emit(events.js:210:7)       at /var/www/lb-api-geolocation/node_modules/socket.io/lib/socket.js:513:12       at _combinedTickCallback(internal / process / next_tick.js:131:7)       at process._tickDomainCallback(internal / process / next_tick.js:218:9)     命令:'RPUSH',     args:['59c54ace9e450c004ad4c90etripA','E4NXUZ417M2UwUxDAAAC'],     代码:'WRONGTYPE'}

    如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的错误直接来自redis,问题是您尝试执行的密钥LPUSH已经存在并且具有不同的类型。

An introduction to Redis data types and abstractions

您遇到WRONGTYPE错误的原因示例:

> set foo bar
OK
> lpush foo 1 2 3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
> type foo
string

我建议您打开redis-shell并执行FLUSHALL清理数据库