Node.js 使用Azure存储节点SDK创建队列消息时,队列触发的Azure函数引发异常
我使用将消息添加到Azure存储队列。根据官方示例,我的代码如下所示:Node.js 使用Azure存储节点SDK创建队列消息时,队列触发的Azure函数引发异常,node.js,azure,azure-functions,azure-storage-queues,Node.js,Azure,Azure Functions,Azure Storage Queues,我使用将消息添加到Azure存储队列。根据官方示例,我的代码如下所示: const AzureStorage = require('azure-storage'); const queueService = AzureStorage.createQueueService(); queueService.createMessage('taskqueue', 'Hello world!', function (error) { if (!error) { // Message inse
const AzureStorage = require('azure-storage');
const queueService = AzureStorage.createQueueService();
queueService.createMessage('taskqueue', 'Hello world!', function (error) {
if (!error) {
// Message inserted
}
});
这会将一条消息添加到taskqueue
队列,从而触发使用节点构建的队列触发的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.
经过大量的谷歌搜索,当我在官方文件中找不到任何东西时,我发现了 显然,通过Azure存储节点SDK对消息进行编码(默认)的方式与通过队列触发节点函数对消息进行解码的方式之间存在不一致。根据上面引用的帖子,Azure存储SDK默认使用
TextXmlQueueMessageEncoder
,而Azure函数期望消息使用TextBase64QueueMessageEncoder
编码
新建@azure/storage queue
lib
新队列库中仍然存在不一致性。在这个库中,我无法找到一种内置的方法来切换编码器,但手动base64对字符串进行编码就可以做到这一点:
const { QueueServiceClient } = require("@azure/storage-queue")
const base64Encode = (str) => Buffer.from(str).toString('base64')
const queueServiceClient = new QueueServiceClient(...)
queueServiceClient.getQueueClient('myqueue').sendMessage(base64Encode('Hello World!'))
Oldazure存储
lib
在旧库中,手动重写默认编码器可以解决此问题
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
}
});
知道如何在Azure.Storage.Queues.QueueClient()上设置QueueMessageEncoder.TextBase64QueueMessageEncoder吗-可能吗???@geedubb不知道很遗憾-我没有使用C#库。不用担心,谢谢。事实证明,我的问题是我的字符串是utf-16而不是utf-8。对于那些面临此问题并使用c#的人,以下是解决方案