繁体   English   中英

将docker-compose与mongodb,node和postman结合使用的正确方法是什么?

[英]What is the correct way to use docker-compose with mongodb, node, and postman?

我知道以前已经有人问过这个问题,但我已经读了很多答案,做了很多谷歌搜索,但似乎仍无法弄清到底是怎么回事。

我想使用docker创建一个待办事项列表应用程序,使用node和mongodb。 我有一个像这样的docker-compose文件

local:
  image: local
  ports:
    - "3000:3000"
  volumes:
    - ./:/project
  links:
    - mongo
  # runs nodemon server.js
  entrypoint: ["npm", "run", "start"]
mongo:
  image: mongo:latest
  ports: 
    - "27017:27017"
  volumes:
    - ./data/db:/data/db
  entrypoint: ["mongod", "--port", "27017"]

我非常小心,以确保要连接到像mongoose.createConnection('mongodb://mongo:27017');这样的mongoose.createConnection('mongodb://mongo:27017'); 而不是本地主机。 但是,当我尝试在Postman中发布到/ tasks路由时,什么也没有发生。 整个server.js文件是

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
const mongoose = require('mongoose');
const Task = require('./api/models/todoListModel');
const bodyParser = require('body-parser');

mongoose.Promise = global.Promise;
mongoose.createConnection('mongodb://mongo:27017');
// I've also tried mongodb://mongo/local:27017 and /project just in case...
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

const routes = require('./api/routes/todoListRoutes');
routes(app);

app.get('/', (req, res) => {
  res.json({ message: 'At least this works...' });
});

app.listen(port);
console.log(`listening on port ${port}`);

谢谢你的尽心帮助!

更新 -以下答案基本上是正确的。 在使用服务器之前,我确实需要等待mongo启动。 但是我不明白在这种情况下,我只能延迟在服务器上监听以使其正常工作。 以下似乎正常工作。

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const mongo = 'mongodb://mongo:27017'

mongoose.connect(mongo);
mongoose.Promise = global.Promise;

const db = mongoose.connection;

db.on('error', (err) => {
  console.log(`DB Error -> ${err}`);
})

app.get('/', (req, res) => {
  res.send('Hello world');
});
/*
Note that the server can be constructed in advance.
It only begins actively listening once the mongo/mongoose connection is fully open.
This way you don't have to use an external script to wait for the ports to open.
*/
db.once('open', () => {
  app.listen(3000, () => {
    console.log('App is listening on 3000');
  });
});

您必须确保mongo正常运行,然后服务器才能运行。 从服务器连接时,当前mongo可能正在启动。 有几种解决方法。 也许一个shell脚本在启动npm进程之前会等待端口27017 查看此问题以供参考如何使用netcat等待开放端口? 这是: https : //docs.docker.com/compose/startup-order/

另外我在您的服务器代码上没有看到POST路由

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM