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

