将golang的字节数组转换为Node.js的JSON。

huangapple go评论95阅读模式
英文:

Casting golang byte array to node json

问题

你好,我可以帮你翻译这段代码。以下是翻译的结果:

嗨,我有两个服务,一个是用Golang编写的,另一个是用Node.js编写的。

Golang的服务使用以下代码将消息发送到Kafka:

var network bytes.Buffer        
enc := gob.NewEncoder(&network)
enc.Encode(product)
produce_to_kafka("add", network.Bytes())

Node.js的服务使用以下代码从Kafka消费消息:

await consumer.run({
  eachMessage: async ({ topic, partition, message, heartbeat }) => {
      console.log({
          key: message.key.toString(),
          value: new Buffer.from(message.value, "binary").toString('ascii'),
          headers: message.headers,
      })
  },
})

你可以看到,我尝试使用Buffer.from函数并指定编码为ascii、binary和base64,但是没有成功。

这是我在Node.js中得到的console.log输出:

[categories]   key: 'add',
[categories]   value: '\x7FO\x7F\x01\x03\x01\x01\x07Product\x01\x7F\x02\x00\x01\x0F\x01\x04Name\x01\f\x00\x01\x02Id\x01\f\x00\x01\x07Storeid\x01\f\x00\x01\tStoreProd\x01\f\x00\x01\x05Price\x01\b\x00\x01\bDiscount\x01\b\x00\x01\x05Brand\x01\f\x00\x01\n' +
[categories]     'Categories\x01\x7F\x04\x00\x01\x04Tags\x01\x7F\x04\x00\x01\bLocation\x01\f\x00\x01\x07InStock\x01\x04\x00\x01\n' +
[categories]     'ExpiryDate\x01\f\x00\x01\tTotalSold\x01\x04\x00\x01\x11LastStockAddition\x01\f\x00\x01\x04Cost\x01\x04\x00\x00\x00\x16\x7F\x03\x02\x01\x01\b[]string\x01\x7F\x04\x00\x01\f\x00\x00i\x7F\x02\x01\x04Stng\x01\x05Stngp\x01\x01t\x01\x06tStngp\x01@\x01@\x01\x06String\x01\x01\x05askdl\x01\x01\x05asdas\x01\x06String\x01\x04\x01\x102021-10-03 12:13\x01\x06\x01\x102021-10-03 12:13\x01\b\x00',
[categories]   headers: {}
[categories] }

此外,我在Golang中也有一个用于同一主题的消费者,并且可以成功将其解析回结构体,使用以下代码:

var network bytes.Buffer;
network.WriteString(string(ev.Value))
dec := gob.NewDecoder(&network) 
var q model.Product
err = dec.Decode(&q)

你能否提供任何资源或语法,告诉我如何在Node.js中实现相同的功能呢?

英文:

Hi I have two services one in golang other in nodejs

Golang one is producing to kafka with the following code

var network bytes.Buffer        
enc := gob.NewEncoder(&network)
enc.Encode(product)
produce_to_kafka("add", network.Bytes())

And node is consuming with following

await consumer.run({
  eachMessage: async ({ topic, partition, message, heartbeat }) => {
      console.log({
          key: message.key.toString(),
          value: new Buffer.from(message.value, "binary").toString('ascii'),
          headers: message.headers,
      })
  },
})

As you can see I've tried casting with buffer.from with ascii, binary and base64 but wasn't successful in doing so.

This is the console.log I'm getting in nodejs

[categories]   key: 'add',
[categories]   value: '\x7FO\x7F\x01\x03\x01\x01\x07Product\x01\x7F\x02\x00\x01\x0F\x01\x04Name\x01\f\x00\x01\x02Id\x01\f\x00\x01\x07Storeid\x01\f\x00\x01\tStoreProd\x01\f\x00\x01\x05Price\x01\b\x00\x01\bDiscount\x01\b\x00\x01\x05Brand\x01\f\x00\x01\n' +
[categories]     'Categories\x01\x7F\x04\x00\x01\x04Tags\x01\x7F\x04\x00\x01\bLocation\x01\f\x00\x01\x07InStock\x01\x04\x00\x01\n' +
[categories]     'ExpiryDate\x01\f\x00\x01\tTotalSold\x01\x04\x00\x01\x11LastStockAddition\x01\f\x00\x01\x04Cost\x01\x04\x00\x00\x00\x16\x7F\x03\x02\x01\x01\b[]string\x01\x7F\x04\x00\x01\f\x00\x00i\x7F\x02\x01\x04Stng\x01\x05Stngp\x01\x01t\x01\x06tStngp\x01@\x01@\x01\x06String\x01\x01\x05askdl\x01\x01\x05asdas\x01\x06String\x01\x04\x01\x102021-10-03 12:13\x01\x06\x01\x102021-10-03 12:13\x01\b\x00',
[categories]   headers: {}
[categories] }

Moreover I have a consume in golang for same topic and can successfully parse that back to struct with the following code

var network bytes.Buffer;
network.WriteString(string(ev.Value))
dec := gob.NewDecoder(&network) 
var q model.Product
err = dec.Decode(&q)

Can you kindly share any resource or syntax how can I do this in nodejs

答案1

得分: 1

你可以使用NodeJS的Buffer API来解码二进制编码字符串。

所以在你的情况下,代码应该是这样的:

var binaryString = '\x7FO\x7F\x01\x03\x01\x01\x07Product\x01\x7F\x02\x00\x01\x0F\x01\x04Name\x01\f\x00\x01\x02Id\x01\f\x00\x01\x07Storeid\x01\f\x00\x01\tStoreProd\x01\f\x00\x01\x05Price\x01\b\x00\x01\bDiscount\x01\b\x00\x01\x05Brand\x01\f\x00\x01\nCategories\x01\x7F\x04\x00\x01\x04Tags\x01\x7F\x04\x00\x01\bLocation\x01\f\x00\x01\x07InStock\x01\x04\x00\x01\nExpiryDate\x01\f\x00\x01\tTotalSold\x01\x04\x00\x01\x11LastStockAddition\x01\f\x00\x01\x04Cost\x01\x04\x00\x00\x00\x16\x7F\x03\x02\x01\x01\b[]string\x01\x7F\x04\x00\x01\f\x00\x00i\x7F\x02\x01\x04Stng\x01\x05Stngp\x01\x01t\x01\x06tStngp\x01@\x01@\x01\x06String\x01\x01\x05askdl\x01\x01\x05asdas\x01\x06String\x01\x04\x01\x102021-10-03 12:13\x01\x06\x01\x102021-10-03 12:13\x01\b\x00';

const data = Buffer.from(binaryString, "binary");

console.log(data);
console.log(data.toString());

然而,正如评论中提到的,我不确定Go gob编码器和NodeJS二进制解码器在所有情况下是否都能正常工作。也许使用另一种格式可能会更好。

希望对你有所帮助。

英文:

You could be able to decode your binary encoding string with the NodeJS Buffer API.

So in your case, it should give something like this:

var binaryString = '\x7FO\x7F\x01\x03\x01\x01\x07Product\x01\x7F\x02\x00\x01\x0F\x01\x04Name\x01\f\x00\x01\x02Id\x01\f\x00\x01\x07Storeid\x01\f\x00\x01\tStoreProd\x01\f\x00\x01\x05Price\x01\b\x00\x01\bDiscount\x01\b\x00\x01\x05Brand\x01\f\x00\x01\nCategories\x01\x7F\x04\x00\x01\x04Tags\x01\x7F\x04\x00\x01\bLocation\x01\f\x00\x01\x07InStock\x01\x04\x00\x01\nExpiryDate\x01\f\x00\x01\tTotalSold\x01\x04\x00\x01\x11LastStockAddition\x01\f\x00\x01\x04Cost\x01\x04\x00\x00\x00\x16\x7F\x03\x02\x01\x01\b[]string\x01\x7F\x04\x00\x01\f\x00\x00i\x7F\x02\x01\x04Stng\x01\x05Stngp\x01\x01t\x01\x06tStngp\x01@\x01@\x01\x06String\x01\x01\x05askdl\x01\x01\x05asdas\x01\x06String\x01\x04\x01\x102021-10-03 12:13\x01\x06\x01\x102021-10-03 12:13\x01\b\x00';

const data = Buffer.from(binaryString, "binary");

console.log(data);
console.log(data.toString());

However, as mentioned in the comments, I don't know if the Go gob encoder and NodeJS binary decoder works well in all situations. Maybe it could be better to use another format.

Hope it helps anyway.

答案2

得分: 1

The gob format 是主要用于 Go 服务之间的通信。

我建议你使用一种跨平台的二进制格式,比如 Protobuf 或 Avro,这些格式通常与 Kafka 一起使用,如果不使用 JSON 的话。

英文:

The gob format is meant to be used primarily between Go services.

I'd recommend that you use a cross compatible binary format such as Protobuf or Avro, which are commonly used with Kafka, if not JSON.

huangapple
  • 本文由 发表于 2022年4月30日 22:29:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/72069382.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定