Nodejs pomelo-rpc 传消息时消息内的时间类型值总是自动转换成字符串类型值!

Nodejs pomelo-rpc 传消息时消息内的时间类型值总是自动转换成字符串类型值!

求助!问一下 有什么阻止转换的 方法吗? 如题: 调用rpc 的时候, 消息内部 的日期值 是 Date 类型,但是接收 后 这个 日期值 变成了 字符串类型!

3 回复

Node.js Pomelo-RPC 传消息时时间类型值总是自动转换成字符串类型值

问题描述

在使用 Pomelo-RPC 进行消息传递时,发现消息内部的 Date 类型值在传输过程中被自动转换成了字符串类型。这可能会影响后续处理的准确性。

解决方法

Pomelo-RPC 默认情况下会将 Date 对象序列化为字符串格式,以确保其兼容性。要解决这个问题,可以自定义序列化和反序列化过程,避免这种自动转换。

示例代码

以下是一个简单的示例,展示如何通过自定义序列化和反序列化来保持 Date 对象的原始类型:

const pomelo = require('pomelo');
const util = require('util');

// 自定义序列化函数
function customSerialize(obj) {
    return JSON.stringify(obj, (key, value) => {
        if (value instanceof Date) {
            return { $date: value.getTime() };
        }
        return value;
    });
}

// 自定义反序列化函数
function customDeserialize(str) {
    return JSON.parse(str, (key, value) => {
        if (typeof value === 'object' && value !== null && '$date' in value) {
            return new Date(value.$date);
        }
        return value;
    });
}

// 创建 RPC 客户端
let client = pomelo.createClient({ 
    serialize: customSerialize,
    deserialize: customDeserialize
});

client.on('disconnect', () => {
    console.log('Disconnected from server.');
});

client.init((err) => {
    if (err) {
        console.error(err);
    } else {
        console.log('Client initialized.');
    }
});

// 调用远程服务
client.request('someRpcService.someMethod', { date: new Date() }, (err, resp) => {
    if (err) {
        console.error(err);
    } else {
        console.log('Response received:', resp);
    }
});

解释

  1. 自定义序列化:在序列化过程中,我们检查每个值是否为 Date 类型。如果是,则将其转换为包含时间戳的对象 { $date: time }
  2. 自定义反序列化:在反序列化过程中,我们检查每个对象是否有 $date 属性。如果有,则将其转换回 Date 对象。
  3. 使用自定义序列化和反序列化:在创建 Pomelo-RPC 客户端时,指定自定义的 serializedeserialize 函数。

通过这种方式,可以确保在传递过程中 Date 对象不会被意外地转换为字符串。


你去看看pomelo-rpc的源码 就是这么写的啊。。。。

当使用 pomelo-rpc 库传递消息时,默认情况下可能会对某些数据类型进行序列化处理,导致 Date 类型被转换为字符串。为了避免这种情况,你可以通过自定义序列化和反序列化的方式来保持 Date 类型。

下面是一个示例,展示如何使用 pomelo-rpc 并保持 Date 类型不变:

自定义序列化和反序列化

  1. 安装依赖: 确保你已经安装了 pomelo-rpcbson(用于处理日期序列化)。

    npm install pomelo-rpc bson
    
  2. 自定义序列化函数

    const { serialize, deserialize } = require('bson');
    
    function customSerialize(obj) {
      return serialize(obj);
    }
    
    function customDeserialize(buffer) {
      return deserialize(buffer);
    }
    
  3. 创建 RPC 客户端和服务端

    服务端

    const PomeloRPC = require('pomelo-rpc');
    const customSerialize = require('./customSerialize');
    const customDeserialize = require('./customDeserialize');
    
    const server = new PomeloRPC.Server({
      serialize: customSerialize,
      deserialize: customDeserialize
    });
    
    server.on('message', (message, reply) => {
      // 处理消息
      reply(message);
    });
    

    客户端

    const PomeloRPC = require('pomelo-rpc');
    const customSerialize = require('./customSerialize');
    const customDeserialize = require('./customDeserialize');
    
    const client = new PomeloRPC.Client({
      serialize: customSerialize,
      deserialize: customDeserialize
    });
    
    client.request('test.rpc', { date: new Date() }, (err, res) => {
      if (err) throw err;
      console.log(res); // 输出包含 Date 对象的消息
    });
    

解释

  • serializedeserialize:使用 bson 库进行自定义序列化和反序列化,以确保 Date 类型不被转换为字符串。
  • PomeloRPC.ServerPomeloRPC.Client:通过设置 serializedeserialize 选项来使用自定义的序列化和反序列化方法。

这样可以确保在通过 pomelo-rpc 传递消息时,Date 类型的数据不会被自动转换为字符串类型。

回到顶部