将消息传递给API

时间:2015-05-26 02:54:40

标签: javascript json node.js azureservicebus

我正在将消息传递给第三方消息队列,该队列将消息中继到我的队列侦听器(所有在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?有什么想法,我可以在传递这个消息时编码/解码一个简单的对象吗?

1 个答案:

答案 0 :(得分:2)

解决此问题的一个解决方案是将info编码为Azure's ServiceBussetRequestHeaders()调用期间无法修改的另一种格式。您可以像在第二个解决方案中那样对字符串进行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}