gpt4 book ai didi

node.js - 用 nets 和 nodejs 堆叠字符串

转载 作者:IT王子 更新时间:2023-10-29 06:13:14 26 4
gpt4 key购买 nike

我在使用 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);
});

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

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 我希望从一个房间添加删除成员,并且检查该成员是否在一个房间里,例如 X。

商业规则

  1. MEMBER 可以在多个房间
  2. 房间内不能有 2 名相同的成员

随着尝试的进行:

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 Operation against a key holding the wrong kind of value at new Command (/var/www/lb-api-geolocation/node_modules/redis/lib/command.js:12:22) at RedisClient.lpush (/var/www/lb-api-geolocation/node_modules/redis/lib/commands.js:58:47) at addRoom (/var/www/lb-api-geolocation/src/socket/connect.js:144:17) at Socket. (/var/www/lb-api-geolocation/src/socket/connect.js:94:9) at emitOne (events.js: 115: 13) at 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) command: 'RPUSH', args: ['59c54ace9e450c004ad4c90etripA', 'E4NXUZ417M2UwUxDAAAC'], code: 'WRONGTYPE'}

如何解决?

最佳答案

您的错误直接来自 redis,问题是您尝试执行的 key 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 来清理您的数据库

关于node.js - 用 nets 和 nodejs 堆叠字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com