Mongoose 服务器选择错误 ECONNREFUSED 与 docker-compose

Posted

技术标签:

【中文标题】Mongoose 服务器选择错误 ECONNREFUSED 与 docker-compose【英文标题】:Mongoose Server Selection Error ECONNREFUSED with a docker-compose 【发布时间】:2020-07-03 11:17:59 【问题描述】:

我正在尝试创建一个最小的 dockerised Mongo Express React Node 堆栈。使用节点时,Mongoose 可以很好地连接到我的 dockerised mongo,但在 docker 内部尝试时失败。

back.js:

const express = require('express');
const app = express();
const mongoose = require('mongoose');

mongoose.connect('mongodb://mongo:27017/test', useNewUrlParser: true, useUnifiedTopology: true,
    () => console.log("connection established"))
    .catch(error => handleError(error));
let db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() 

// some stuff

    );

    app.listen(3000, function () 
        console.log('Express-js listening on port 3000')
    );
);

docker-compose.yml:

version: "3.7"

services:
  mongodb:
    image: mongo:latest
    container_name: mongo
    volumes: 
      - mongodb-data:/data/db
    ports:
      - 27017:27017

  express-js:
    build: ./back-express/ #local Dockerfile
    ports:
      - 3000:3000
    depends_on:
      - mongodb

volumes: 
  mongodb-data:

Docker 文件:

FROM node:lts
WORKDIR ./
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "back.js"]

错误:

express-js_1     | connection error: MongooseError [MongooseServerSelectionError]: connect ECONNREFUSED 127.0.0.1:27017
express-js_1     |     at new MongooseServerSelectionError (/node_modules/mongoose/lib/error/serverSelection.js:22:11)

(...)

express-js_1     |   message: 'connect ECONNREFUSED 127.0.0.1:27017',
express-js_1     |   name: 'MongooseServerSelectionError',
express-js_1     |   reason: TopologyDescription 
express-js_1     |     type: 'Single',
express-js_1     |     setName: null,
express-js_1     |     maxSetVersion: null,
express-js_1     |     maxElectionId: null,
express-js_1     |     servers: Map  'localhost:27017' => [ServerDescription] ,
express-js_1     |     stale: false,
express-js_1     |     compatible: true,
express-js_1     |     compatibilityError: null,
express-js_1     |     logicalSessionTimeoutMinutes: null,
express-js_1     |     heartbeatFrequencyMS: 10000,
express-js_1     |     localThresholdMS: 15,
express-js_1     |     commonWireVersion: null
express-js_1     |   ,
express-js_1     |   [Symbol(mongoErrorContextSymbol)]: 
express-js_1     | 

我尝试在 Dockerfile 的最后一行之前添加它: CMD ["sleep", "10"] 但是没有效果。

我不知道出了什么问题。我花了很长时间在互联网上搜索。任何帮助都会让我开心。

可在此处访问完整代码:https://github.com/npasquie/back-express 在第一个克隆这个项目:https://github.com/npasquie/back-express

【问题讨论】:

【参考方案1】:

我的一个朋友找到了答案。该代码有效,但我忘记在启动容器之前使用docker-compose build 重建我的图像。

很抱歉原来的问题没有真正有用,但我认为我不会删除它,因为它可能对犯同样错误的其他初学者有所帮助。

【讨论】:

拍摄您的代码示例帮助我调试了我的问题。感谢您继续关注

以上是关于Mongoose 服务器选择错误 ECONNREFUSED 与 docker-compose的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 自定义类型在 hapi / rest-hapi 中导致 500 内部服务器错误

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

无法使用 mongoose Model.save() 保存 - 给出内部服务器错误

Node.js 和 MongoDB Atlas Mongoose 连接错误

Express Js Mongoose 不抛出 Invalid Column 错误

无法通过节点休息应用程序上的mongoose连接到mongodb-altas,连接失败:“UnhandledPromiseRejectionWarning:错误:连接EACCES”