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
相关产品推荐
相关产品推荐

