我正在将消息传递给第三方消息队列,该队列将消息中继到我的队列侦听器(所有在node.js服务器端)。该消息具有预定义的格式,允许我定义"自定义属性"。这在我提供基本类型(字符串,数字等)时工作正常,但是当我尝试在自定义属性中传递对象时,它会失败。
发送此消息:
var info = {foo: 100};
var message = {
body: 'some string',
customProperties: {
type: 1,
name: 'test',
info: info
}
};
返回此消息:
{
body: 'some string',
customProperties: {
type: 1,
name: 'test',
info: '[object Object]'
}
};
发送此消息:
var info = {foo: 100};
var message = {
body: 'some string',
customProperties: {
type: 1,
name: 'test',
info: JSON.stringify(info)
}
};
返回此消息:
{
body: 'some string',
customProperties: {
type: 1,
name: 'test',
info: '\\"{\\"foo\\":100}\\"'
}
};
当我尝试使用JSON.parse(customProperties.info)
对其进行解码时失败。我认为发生的事情是它在每个自定义属性上调用.toString
?有什么想法,我可以在传递这个消息时编码/解码一个简单的对象吗?
答案 0 :(得分:2)
解决此问题的一个解决方案是将info
编码为Azure's ServiceBus中setRequestHeaders()
调用期间无法修改的另一种格式。您可以像在第二个解决方案中那样对字符串进行JSON编码,但是您可以对结果进行Base64编码,如下所示:
var info = {foo: 100};
var message = {
body: 'some string',
customProperties: {
type: 1,
name: 'test',
info: btoa(JSON.stringify(info))
}
};
这样会产生customProperties
:
{type: 1, name: "test", info: "eyJmb28iOjEwMH0="}
然后进行解码,你只需要
var info = JSON.parse(atob(message.customProperties.info));
产生
{foo: 100}