You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:47:19