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
相关产品推荐
相关产品推荐

