You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中用@azure/service-bus操作Service Bus时报错:this.container.get_option is not a function

问题描述

在Next.js 15.0.1应用中使用@azure/service-bus 7.9.5包与Azure Service Bus队列交互时,ServiceBusAdministrationClient可正常获取队列列表,但执行消息收发/查看操作时抛出错误:

TypeError: this.container.get_option is not a function

正常运行的队列列表获取代码

export async function getQueuesForServicebus(
  connectionString: string,
): Promise<QueueDetails[]> {
  try {
    const client = new ServiceBusAdministrationClient(connectionString);
    const queueDetails: QueueDetails[] = [];

    for await (const queue of client.listQueues()) {
      const props = await client.getQueueRuntimeProperties(queue.name);

      queueDetails.push({
        name: queue.name,
        activeMessageCount: props.activeMessageCount,
        deadLetterMessageCount: props.deadLetterMessageCount,
      });
    }

    return queueDetails;
  } catch (error) {
    console.error("Error fetching queues:", error);
    return [];
  }
}

报错的消息接收代码

export async function getMessagesFromQueue(
  servicebusName: string,
  queueName: string,
): Promise<QueueMessage[]> {
  try {
    // 此处有获取并验证连接字符串的逻辑

    const sbClient = new ServiceBusClient(servicebus.connection);
    const receiver = sbClient.createReceiver(queueName);

    const messages = await receiver.receiveMessages(5);
    for (const msg of messages) {
      console.log(`Message received: ${msg.body}`);
    }

    return [];
  } catch (err) {
    console.error(`Error fetching messages from queue: ${queueName}`, err);
    return [];
  }
}

报错栈信息

Error fetching messages from queue: voucher-queue TypeError: Error 0: TypeError: this.container.get_option is not a function
    at new Promise (<anonymous>)
    at async getMessagesFromQueue (src/actions/servicebus.ts:91:21)
  89 |     const receiver = sbClient.createReceiver(queueName);
  90 |
> 91 |     const messages = await receiver.receiveMessages(5);
     |                     ^
  92 |     for (const msg of messages) {
  93 |       console.log(`Message received: ${msg.body}`);
  94 |     }

解决方案

1. 指定Next.js运行时为Node.js

Next.js 15的App Router默认使用Edge Runtime,而@azure/service-bus 7.x部分版本在Edge环境下存在依赖兼容性问题(Edge Runtime不支持部分Node.js核心模块)。在消息操作文件顶部添加运行时声明:

export const runtime = "nodejs";

2. 升级@azure/service-bus到最新稳定版

旧版本的@azure/service-bus可能存在与新Next.js版本的兼容性bug,执行以下命令升级:

npm install @azure/service-bus@latest
# 或使用yarn
yarn add @azure/service-bus@latest

3. 复用ServiceBusClient实例(最佳实践)

每次请求创建新的ServiceBusClient会造成资源浪费,建议全局复用实例:

// 全局维护ServiceBusClient实例
let sbClient: ServiceBusClient | undefined;

function getServiceBusClient(connectionString: string): ServiceBusClient {
  if (!sbClient) {
    sbClient = new ServiceBusClient(connectionString);
  }
  return sbClient;
}

// 修改消息接收函数
export async function getMessagesFromQueue(
  servicebusName: string,
  queueName: string,
): Promise<QueueMessage[]> {
  try {
    // 获取连接字符串逻辑
    const client = getServiceBusClient(servicebus.connection);
    const receiver = client.createReceiver(queueName);

    const messages = await receiver.receiveMessages(5);
    // 按需转换消息格式
    const result = messages.map(msg => ({
      id: msg.messageId,
      body: msg.body,
      enqueuedTime: msg.enqueuedTimeUtc
    }));

    // 业务完成后关闭receiver
    await receiver.close();
    return result;
  } catch (err) {
    console.error(`Error fetching messages from queue: ${queueName}`, err);
    return [];
  }
}

4. 检查Node.js版本兼容性

确保项目使用的Node.js版本符合@azure/service-bus 7.x要求(推荐Node.js 16.x及以上),Next.js 15建议使用Node.js 18+,可通过node -v查看当前版本,版本过低则升级。


内容的提问来源于stack exchange,提问作者Joel Magnusson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:55:11