在aredes中使用redis时间序列错误=>处理发布事件时出错:[ErrorReply:ERR TSDB:无效值]

问题描述 投票:0回答:1

我在 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]

javascript node.js redis aedes
1个回答
0
投票

您尝试存储的值不是数字。

参见TS.ADD

值 是样本的(双精度)数字数据值。双数应遵循 RFC 7159(JSON 标准)。特别是,解析器会拒绝不适合 binary64 的过大值。它不接受 NaN 或无限值。

© www.soinside.com 2019 - 2024. All rights reserved.