Redis调用zAdd报错TypeError: Cannot read properties of undefined (reading 'toString')
错误原因分析
你遇到的TypeError是因为调用client.zAdd()时错误地将参数数组redisArgs用JSON.stringify()转成了字符串。
@redis/client库的zAdd方法要求参数格式为key, score1, member1, score2, member2...(或特定对象格式),但你传入的是JSON字符串,客户端会把这个字符串当作唯一参数(即有序集合的key),后续需要的分数、成员参数都变成了undefined。当内部代码尝试对undefined调用toString()方法时,就触发了这个错误。
修正方案
直接传递redisArgs数组的展开参数即可,不需要做JSON序列化:
方案1:使用async/await(贴合你的异步代码风格)
const updateLeaderboards = async () => { try { const users = await User.findAll(); const leaderboardData = []; users.forEach((user) => { leaderboardData.push(user.totalAmount); leaderboardData.push(user.username); }); const redisArgs = ['leaderboard', ...leaderboardData]; console.log("redisargs #######", redisArgs); // 直接展开redisArgs作为zAdd的参数 await client.zAdd(...redisArgs); console.log('Leaderboard updated successfully in Redis.'); } catch (error) { console.error('An error occurred while updating leaderboard data:', error); } };
方案2:保留回调写法
const updateLeaderboards = async () => { try { const users = await User.findAll(); const leaderboardData = []; users.forEach((user) => { leaderboardData.push(user.totalAmount); leaderboardData.push(user.username); }); const redisArgs = ['leaderboard', ...leaderboardData]; console.log("redisargs #######", redisArgs); client.zAdd(...redisArgs, (err, response) => { if (err) { console.error('An error occurred while updating leaderboard data:', err); } else { console.log('Leaderboard updated successfully in Redis.'); } }); } catch (error) { console.error('An error occurred while updating leaderboard data:', error); } };
内容的提问来源于stack exchange,提问作者Vinay Kumar
相关产品推荐
相关产品推荐

