我在 aedes 中使用 redis 时间序列,我希望当有人发布某些内容时,数据应该以对象值的形式存储在 Redis 中:[{status,timestamp},{status,timestamp]
我尝试这段代码但出现错误 代码=>
const { createClient } = require('redis'); const { TimeSeriesDuplicatePolicies, TimeSeriesEncoding, TimeSeriesAggregationType } = require('@redis/time-series');
const clt = createClient();
(异步()=> {
try {
// Connect to Redis before creating the time series
await clt.connect();
const created = await clt.ts.create('random', {
RETENTION: 86400000, // 1 day in milliseconds
ENCODING: TimeSeriesEncoding.UNCOMPRESSED, // No compression
DUPLICATE_POLICY: TimeSeriesDuplicatePolicies.BLOCK, // No duplicates
});
if (created === 'OK') {
console.log('Created timeseries.');
} else {
console.error('Error creating timeseries:', created);
}
} catch (error) {
console.error('Error connecting to Redis or creating timeseries:', error);
}
})();
aedes.on('发布', 异步函数 (数据包, 客户端) { 如果(客户端){ 控制台.log(
MESSAGE_PUBLISHED : MQTT Client ${(client ? client.id : 'AEDES BROKER_' + aedes.id)} has published message "${packet.payload}" on ${packet.topic} to aedes broker ${aedes.id}
);
try {
// Convert buffer payload to string
const payloadString = packet.payload.toString('utf8');
// Parse the payload string as JSON
const data = JSON.parse(payloadString);
const timestamp = Date.now();
// Extract data from the JSON payload
const deviceId = data.deviceID;
const nodeId = data.NodeID;
const status = data.status;
const value = {
status: status,
timestamp: timestamp
};
const serializedValue = JSON.stringify(value);
console.log("Data:", data);
console.log("DID:", deviceId);
console.log("NODEID:", nodeId);
console.log("Status:", status);
console.log("Value to be stored in Redis time series:", value);
// Add the data to the Redis time series
const result = await clt.ts.add(`${deviceId}:${nodeId}`, timestamp, serializedValue);
console.log("Result from Redis:", result)
console.log(`Added timestamp ${currentTimestamp}, value ${value}.`);
// console.log("Result from Redis:", result);
console.log("Data saved to Redis time series.");
} catch (error) {
console.error("Error handling publish event:", error);
}
}
});
并在邮递员中发送数据=> { “设备ID”:“23423432”, “节点ID”:“34534”, “状态”:“1” }
错误=> 数据:{ deviceID:'23423432',NodeID:'34534',状态:'1'} 拨打电话:23423432 节点ID:34534 状态:1 要存储在 Redis 时间序列中的值: { status: '1', timestamp: 1711579778262 } 处理发布事件时出错:[ErrorReply: ERR TSDB: invalid value]
您尝试存储的值不是数字。
参见TS.ADD:
值 是样本的(双精度)数字数据值。双数应遵循 RFC 7159(JSON 标准)。特别是,解析器会拒绝不适合 binary64 的过大值。它不接受 NaN 或无限值。