创建队列时ServiceBus Node.Js SDK引发错误

时间:2019-05-05 18:53:36

标签: node.js azureservicebus azure-servicebus-queues

出于明显的原因,连接字符串/域名的某些部分被星号所迷惑。

我正在使用npm中的"azure-sb": "^0.11.0"。下面是我尝试创建队列的代码段。

/* Connection string taken from Azure Portal shared access policies */
let serviceBusService = azure.createServiceBusService(SERVICEBUS_CONNECTION_STRING);

serviceBusService.createQueueIfNotExists(SERVICE_BUS_QUEUE_NAME, function(error){
    if(!error){
        console.log(`Looks like we'll be up and running.`);
    }
    /* This statement gets executed. */
    else {
        console.error(`Something went wrong when trying to boot up: ${error}`);
    }
});
  

尝试启动时出了点问题:错误:401-InvalidAudience:授权标头包含   受众群体错误的令牌。   跟踪号码: ******,   SystemTracker:*****。servicebus.windows.net:Endpoint=sb:/ ******。servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey = *******

我没有使用默认的连接字符串(据我所知在任何地方都没有设置观众)来更改任何设置,但是失败了。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

问题通常在javascript中的设备名称与您生成的SAS密钥中的发布者名称不同步时出现。

例如

enter image description here

当代码中的deviceName变量(在POST URL中使用)与SAS密钥中的发布者名称匹配时,无论其他标题是否已注释掉,都可以正常工作。

当我将设备名称更改为与SAS密钥中的发布者不匹配时,它将立即引发“无效授权令牌受众”错误。

只要deviceName与SAS中的Publishers令牌匹配,该东西就可以正常工作了,注释了其他标头。

尝试验证并查看是否有帮助。

答案 1 :(得分:0)

据我所知,如果您仔细阅读了Azure/azure-sdk-for-node的文档README.md,将发现如下所示的Azure Service Bus的三个节点程序包。

  1. azure-sbAzure service modules
  2. azure-arm-sbAzure Resource Management (ARM)
  3. azure-asm-sbAzure Service Management (ASM)

实际上,他们要求您使用不同的身份验证方式来使用不同的功能,请仔细阅读文档Authentication.md

因此,对于azure-sb来说,它似乎用于访问Azure ServiceBus服务,如下面所述的npm软件包描述。

  

用于Node.js的Microsoft Azure SDK-库

     

该项目提供用于访问Azure ServiceBus服务的Node.js程序包。

要为服务总线实例创建队列,请参考相关的REST API Create Queue,它是资源管理API。因此,我建议您所需的正确的节点软件包是azure-arm-sbService Principal Authentication

没有交互的示例代码如下。

const Azure = require('azure');
const MsRest = require('ms-rest-azure');
const ServiceBusManagementClient = require("azure-arm-sb");

MsRest.loginWithServicePrincipalSecret(
  'clientId or appId',
  'secret or password',
  'domain or tenantId',
  (err, credentials) => {
    if (err) throw err

    const client = new ServiceBusManagementClient(credentials, 'subscriptionId');

    // ..use the client instance to manage service resources.
    client.Queues.createOrUpdate(resourceGroupName, namespaceName, queueName, parameters: sbQueue, function(sbq) {
    })

  }
);

请查看有关azure-arm-sb package的更多详细信息。希望对您有所帮助。

答案 2 :(得分:0)

azure-sb库是较旧的服务总线SDK。尽管我认为它应该可以工作,但是我建议使用最近发布的@azure/service-bus的最新版本7.0.0。

版本7提供了ServiceBusAdministrationClient,可让您管理服务总线实体,并通过连接字符串和Azure Active Directory凭据支持身份验证。

对于此问题中的问题,这是一个使用ServiceBusAdministrationClient显示队列创建的示例-administrationClient.ts

我知道这是一个较晚的答复,但以防万一有人遇到旧的节点服务总线SDK的问题并降落在此处,请参阅下面的链接。