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

Node.js中如何通过Redis Stream发送含数组的JSON数据?

问题分析与解决

核心原因

Redis Stream的XADD命令仅支持字符串、数字等基础数据类型作为字段值,不允许直接存储数组、嵌套对象这类复杂结构。ioredis在发送数据前会做类型校验,当检测到字段值是数组时,就会抛出你看到的Data type of property ${key} is not supported.错误。

另外你的测试JSON里存在语法错误:"food": "1, 缺少闭合的双引号,需要先修正这个问题。

解决方案

方法1:将复杂结构序列化为JSON字符串

把数组或嵌套对象转成JSON字符串后作为单个字段的值存入Stream,读取时再反序列化回来。示例代码:

const Redis = require('ioredis');
const redis = new Redis();

// 修正语法错误并序列化数组字段
const testData = {
    "name": "abc",
    "ts": 123,
    "lists": JSON.stringify([{
        "oil": "1",
        "food": "1",
        "item": "1"
    }])
};

// 发送到Redis Stream
redis.xadd('test-stream', '*', ...Object.entries(testData).flat())
    .then(() => console.log('数据发送成功'))
    .catch(err => console.error('发送失败:', err));

// 读取时反序列化
redis.xrange('test-stream', '-', '+')
    .then(entries => {
        entries.forEach(entry => {
            const data = entry[1];
            // 把lists字段转回到数组
            data.lists = JSON.parse(data.lists);
            console.log('读取到的数据:', data);
        });
    });

方法2:扁平化复杂结构

如果需要Stream里的字段能单独被查询,可以把数组展开,用带索引的字段名存储,比如:

const flatData = {
    "name": "abc",
    "ts": 123,
    "lists_0_oil": "1",
    "lists_0_food": "1",
    "lists_0_item": "1"
};

redis.xadd('test-stream', '*', ...Object.entries(flatData).flat())
    .then(() => console.log('扁平化数据发送成功'));

内容的提问来源于stack exchange,提问作者shubh gaikwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:15:42