Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Azure存储节点SDK创建队列消息时,队列触发的Azure函数引发异常_Node.js_Azure_Azure Functions_Azure Storage Queues - Fatal编程技术网

Node.js 使用Azure存储节点SDK创建队列消息时,队列触发的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

我使用将消息添加到Azure存储队列。根据官方示例,我的代码如下所示:

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!'))
Old
azure存储
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#的人,以下是解决方案