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

Docker-Compose部署Express+MongoDB:文件更新不生效及报错问题

Docker-Compose部署MongoDB+Express:代码更新不生效及旧代码报错问题

问题描述

尝试用Docker-Compose部署MongoDB和Express,已知MongoDB连接存在未解决问题,但运行docker-compose up时server.js报错。更新server.js后,Docker未检测到修改,仍返回相同错误信息。

错误信息

expressnew | ff
expressnew | /usr/src/app/server.js:8
expressnew | app.use(cors());
expressnew |     ^
expressnew | 
expressnew | ReferenceError: cors is not defined
expressnew |     at Object.<anonymous> (/usr/src/app/server.js:8:5)
expressnew |     at Module._compile (node:internal/modules/cjs/loader:1165:14)
expressnew |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10)
expressnew |     at Module.load (node:internal/modules/cjs/loader:1043:32)
expressnew |     at Function.Module._load (node:internal/modules/cjs/loader:878:12)
expressnew |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
expressnew |     at node:internal/main/run_main_module:22:47

我的docker-compose.yml配置

version: "3.8"

services:
  mongodb:
    container_name: mongo_ex
    image: mongo
    env_file: ./.env
    environment:
      - MONGO_INITDB_ROOT_USERNAME=Alexso0121
      - MONGO_INITDB_ROOT_PASSWORD=LR4135alex
    ports:
      - '27017:27017'
    volumes:
      - db:/data/db
  app:
    container_name: expressnew
    depends_on:
      - mongodb
    build: .
    env_file: ./.env
    ports:
      - '80:3000'
    environment:
      - DB_HOST=mongodb
      - DB_USER=alexso0121
      - DB_PASSWORD=LR4135alex
      - DB_NAME=
      - DB_PORT=$MONGODB_DOCKER_PORT
    stdin_open: true
    tty: true

volumes:
  db:

更新后的server.js代码

const bodyParser = require('body-parser')
const express = require('express')
const app = express()
console.log("ff")
const mongoose=require('mongoose')  
mongoose.set('strictQuery',false)
require('dotenv/config')


app.use(bodyParser.json());


const db=mongoose.connection
db.on('error',(error)=>console.error(error))
db.once('open',()=> console.log('connect to db'))

mongoose.connect(
    process.env.DB_CONNECTION
    ,{ useNewUrlParser:true })
app.use(logger)

//app.use(bodyParser.urlencoded({ extended: false }));

app.get('/',logger,(req,res)=>{
    console.log("ddd")
    //res.status(500)
    res.json({ username : "alex"})

})

const userRouter = require('./routes/users')

function logger(req,res,next){
    console.log(req.originalUrl)
    next()
}
app.use('/users',userRouter)
app.listen(3000)

解决方案

1. 解决代码更新不生效的问题

Docker容器基于构建好的镜像运行,修改本地代码后,必须重新构建镜像才能让容器加载新代码:

  • 执行命令:docker-compose up --build,该命令会重新构建app服务的镜像,并启动容器。
  • 开发环境下,为了避免每次修改都重新构建,可以给app服务添加卷挂载,将本地代码目录映射到容器内的工作目录,实现实时同步:
    修改docker-compose.yml中app服务的配置,添加volumes字段:
    app:
      # ... 原有配置
      volumes:
        - ./:/usr/src/app  # 本地当前目录映射到容器内的/usr/src/app
    

2. 解决旧代码的cors错误

错误信息显示旧代码中调用了app.use(cors())但未定义cors变量。虽然你现在的新代码已经移除了这一行,但如果后续需要使用cors功能,需按以下步骤操作:

  • 安装cors依赖:npm install cors
  • 在server.js顶部引入:const cors = require('cors')
  • 启用cors中间件:app.use(cors())

3. 补充MongoDB连接建议

你提到MongoDB连接存在未解决问题,这里给两个关键点:

  • 确保DB_CONNECTION环境变量格式正确,示例:mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin,root用户需要指定authSource=admin才能正常认证。
  • depends_on仅保证mongodb服务先启动,不保证MongoDB服务完全就绪。可以在代码中添加重连逻辑,或者使用wait-for-it等工具,等待MongoDB端口可用后再启动Express服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:24