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

Docker环境下RabbitMQ消费者执行返回undefined错误排查求助

Docker环境下RabbitMQ消费者执行返回undefined错误排查求助

各位大佬好,我遇到一个很棘手的问题:本地运行Node.js服务时一切正常,但用Docker部署后,RabbitMQ的消费者函数在服务启动阶段就自动执行了,还返回了undefined错误,本地完全没这个情况,实在搞不懂哪里出问题了,想请大家帮忙排查下。

先给大家贴一下相关代码:

1. 入口文件 index.ts

import express from 'express';
import cors from 'cors';
import mongoose from 'mongoose';
import messageController from './controller/messagecontroller';
import router from './routes/messageRouter';
import dotenv from 'dotenv';
import {Server, Socket} from 'socket.io'

dotenv.config()

const app = express()

app.use(cors());
app.use(express.json());

// 这里调用了消费者相关的函数
messageController.userSave()

app.use(router);

const mongoUrl: string | undefined = process.env.MONGO_URL

if (!mongoUrl) {
  console.error('MongoDB connection URL is not defined.');
  process.exit(1);
}

mongoose.connect(mongoUrl).then(()=>{
  console.log('database connected..');
})
.catch((err)=>{
  console.log("Database connection error", err);
})

const server = app.listen('8004', () => {
  console.log("messaging service listening on PORT 8004");
})

2. 控制器中的 userSave 方法

async userSave() {
  try {
    const userData: any = await userMessageConsumers.userCreatedMessageConsumer()
    const newUser = new UserModel({
      _id: userData._id,
      username: userData.username,
      phone: userData.phone,
      email: userData.email,
      profilePicture: userData.profilePicture,
      createdAt: userData.createdAt,
      updatedAt: userData.updatedAt,
      status: userData.status,
    })
    await newUser.save()
    return
  } catch (error) {
    console.log(error);
  }
},

3. RabbitMQ消费者函数 userCreatedMessageConsumer

async userCreatedMessageConsumer(){
  try{
    console.log("starting rabbit mq channel ");
    const channel = await RabbitMQ.createChannel();
    const exchangeName = 'user-message-exchange';
    const queueName = 'user-message-exchange';

    await channel.assertExchange(exchangeName, 'direct', {durable: false});
    const {queue} = await channel.assertQueue(queueName, {durable: false});
    const routingKey = 'user-message-created';

    await channel.bindQueue(queue ,exchangeName, routingKey);

    return new Promise((resolve ,reject)=>{
      channel.consume(queue, (message: any)=>{
        if(message){
          try {
            const createdGig: any = JSON.parse(message.content.toString());
            channel.ack(message);
            resolve(createdGig)
          } catch (error) {
            console.error("error processing gig creation");
            channel.ack(message);
            reject(error)
          }
        }
      })
    })
    // 注意这里:return Promise之后的代码永远不会执行
    await channel.close()
  }catch(err){
    console.error("error setting up consumer", err)
  }
},

我自己梳理的几个疑点,想请教大家:

  • 本地和Docker环境的RabbitMQ连接配置是否有差异?比如Docker里的服务名、端口映射有没有问题?
  • 消费者函数里,返回Promise之后的await channel.close()根本不会执行,会不会导致Docker环境下连接泄漏或者状态异常?
  • 服务启动时就调用messageController.userSave(),这时候MongoDB可能还没连接完成(因为mongoose.connect是异步的),会不会在Docker里因为启动顺序问题,导致保存用户时出错?
  • 消费者函数如果没有捕获到消息,会不会一直挂着导致返回undefined?本地可能因为消息队列里有缓存的消息,而Docker里是新环境没有消息?

有没有大佬遇到过类似的Docker+RabbitMQ的问题,麻烦给点思路,谢谢!

备注:内容来源于stack exchange,提问作者aswanth6000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:12:58