javascript Node convert Decimal to Bytes - Avro Schema Kafka / Kafkajs

qeeaahzv  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(129)

我正在使用http://kafka.js.org/向Kafka生成消息,我正在处理的模式之一是十进制字节类型:

{"type": "bytes", "logicalType": "decimal", "precision": 11, "scale": 2}

我正在寻找一些关于如何将Node中的十进制转换为字节值以匹配上述模式的指导。
先谢谢你了。

ldioqlga

ldioqlga1#

您可以尝试https://www.npmjs.com/package/@ovotech/avro-decimal
这个软件包帮助我们解决了同样的问题

q5iwbnjs

q5iwbnjs2#

我们还使用https://www.npmjs.com/package/@ovotech/avro-decimal解决了这个问题
下面是代码的相关部分:

const {AvroDecimal} = require('@ovotech/avro-decimal');
const {Decimal} = require('decimal.js');

const registry = new SchemaRegistry({host: 'http://localhost:8201'}, {forSchemaOptions: {logicalTypes: {decimal: AvroDecimal}}})

我假设你使用@kafkajs/confluent-schema-registry。正如你所看到的,SchemaRegistry构造函数有一个可选参数,可以让你添加自定义序列化器和反序列化器(AvroDecimal将是我们的自定义小数序列化器/反序列化器)。
然后当你构建你的消息时,使用Decimal构造函数,如下所示

const myObject = {
  stringField: 'whatever String' 
  decimalField: new Decimal('1.0'),
}

那就像往常一样发你的信息吧

const id = await registry.getLatestSchemaId(REGISTRY_SUBJECT);
const record = await registry.encode(id, myObject);
await producer.connect();
await producer.send({
  topic: MY_TOPIC
  messages: [{
    value: record
  }]
}
);

相关问题