使用Azure存储节点SDK创建队列消息时,队列触发Azure功能会引发异常

Chr*_*son 2 azure node.js azure-storage-queues azure-functions

我使用Azure存储节点SDK将消息添加到Azure存储队列.官方例子之后,我的代码如下:

const AzureStorage = require('azure-storage');
const queueService = AzureStorage.createQueueService();

queueService.createMessage('taskqueue', 'Hello world!', function (error) {
  if (!error) {
    // Message inserted
  }
});
Run Code Online (Sandbox Code Playgroud)

这会向taskqueue队列添加一条消息,从而触发使用Node构建的队列触发的Azure功能.当Azure函数收到消息时,它会引发以下异常:

Exception while executing function: Functions.Function2. 
Microsoft.Azure.WebJobs.Host: Exception binding parameter 'queuedMessage'. 
mscorlib: The input is not a valid Base-64 string as it contains a non-base 
64 character, more than two padding characters, or an illegal character 
among the padding characters.
Run Code Online (Sandbox Code Playgroud)

Chr*_*son 5

经过相当数量的谷歌搜索,当我在官方文档中找不到任何内容时,我发现了这篇优秀的帖子.

显然,通过Azure存储节点SDK对消息进行编码(默认情况下)以及如何通过队列触发的节点功能对其进行解码之间存在不一致.根据上面引用的帖子,Azure存储SDK默认使用TextXmlQueueMessageEncoder,而Azure功能期望消息使用TextBase64QueueMessageEncoder.

手动覆盖默认编码器解决了问题.

const AzureStorage = require('azure-storage');
const QueueMessageEncoder = AzureStorage.QueueMessageEncoder;

const queueService = AzureStorage.createQueueService();
queueService.messageEncoder = new QueueMessageEncoder.TextBase64QueueMessageEncoder();
queueService.createMessage('taskqueue', 'Hello world!', function(error) {
  if (!error) {
    // Message inserted
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 对于那些面临此问题并使用 c# 的人,这里是解决方案 /sf/ask/4411643701/ (2认同)