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

使用docker-compose时MongoDB连接失败及本地Node.js应用显示异常

问题分析与解决方案

核心问题汇总

  1. Mongo-Express无法连接MongoDB:服务名解析错误
  2. 本地运行Node服务页面空白:Express模块未引入
  3. MongoDB连接地址错误:混用mongo-express端口与MongoDB端口,未使用正确服务地址
  4. 代码变量冲突:接口回调中重名覆盖响应对象

分步修复

1. 修复Mongo-Express连接失败问题

修改docker-compose.yml中mongo-express的服务配置,将ME_CONFIG_MONGODB_SERVER值改为与MongoDB服务名一致的mongodb:

version: '3'
services:
  my-app:
    build: .
    ports:
      - 3000:3000
    environment:
      - NODE_ENV=docker
    depends_on:
      - mongodb
  mongodb:
    image: mongo
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    volumes:
      - mongo-data:/data/db
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8080:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_SERVER=mongodb  # 修正服务名
volumes:
  mongo-data:
    driver: local

2. 修复server.js核心问题

2.1 补全Express模块引入

在server.js开头添加缺失的Express模块引入,这是本地页面空白的关键原因:

let express = require('express');

2.2 修正MongoDB连接地址与代码逻辑

替换硬编码的错误地址,根据运行环境自动选择连接字符串,同时修复变量冲突与错误处理:

let path = require('path');
let fs = require('fs');
let express = require('express');  // 新增引入
let MongoClient = require('mongodb').MongoClient;
let bodyParser = require('body-parser');
let app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname, "index.html"));
});

app.get('/profile-picture', function (req, res) {
  let img = fs.readFileSync(path.join(__dirname, "images/profile-1.jpg"));
  res.writeHead(200, {'Content-Type': 'image/jpg' });
  res.end(img, 'binary');
});

let mongoUrlLocal = "mongodb://admin:password@localhost:27017";
let mongoUrlDocker = "mongodb://admin:password@mongodb";
let mongoClientOptions = { useNewUrlParser: true, useUnifiedTopology: true };
let databaseName = "user-account";
// 根据环境变量自动选择连接地址
let mongoUrl = process.env.NODE_ENV === 'docker' ? mongoUrlDocker : mongoUrlLocal;

app.post('/update-profile', function (req, res) {
  let userObj = req.body;
  MongoClient.connect(mongoUrl, mongoClientOptions, function (err, client) {
    if (err) {
      console.error(err);
      return res.status(500).send('数据库连接失败');
    }

    let db = client.db(databaseName);
    userObj['userid'] = 1;

    let myquery = { userid: 1 };
    let newvalues = { $set: userObj };

    // 回调参数改为result,避免覆盖外层res对象
    db.collection("users").updateOne(myquery, newvalues, {upsert: true}, function(err, result) {
      if (err) {
        console.error(err);
        return res.status(500).send('更新失败');
      }
      client.close();
      res.send(userObj);
    });
  });
});

app.get('/get-profile', function (req, res) {
  MongoClient.connect(mongoUrl, mongoClientOptions, function (err, client) {
    if (err) {
      console.error(err);
      return res.status(500).send('数据库连接失败');
    }

    let db = client.db(databaseName);
    let myquery = { userid: 1 };

    db.collection("users").findOne(myquery, function (err, result) {
      if (err) {
        console.error(err);
        return res.status(500).send('查询失败');
      }
      client.close();
      res.send(result || {});
    });
  });
});

app.listen(3000, function () {
  console.log("app listening on port 3000!");
});

2.3 本地运行注意事项

  • 确保本地MongoDB已启动,且已创建admin用户及对应密码
  • 若本地MongoDB未开启认证,需将mongoUrlLocal改为mongodb://localhost:27017

3. Dockerfile优化(可选)

添加端口暴露,增强容器规范性:

ENV MONGO_DB_USERNAME=admin \
    MONGO_DB_PWD=password

RUN mkdir -p /home/app

COPY ./app /home/app
WORKDIR /home/app
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]

验证步骤

  1. 本地运行:
    • 启动本地MongoDB
    • 执行node server.js
    • 访问http://localhost:3000,页面应正常显示
  2. Docker Compose运行:
    • 执行docker-compose build构建镜像
    • 执行docker-compose up启动服务
    • 访问http://localhost:3000验证应用,http://localhost:8080验证mongo-express

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:54:54