英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论