【问题标题】:"MongoError: The $changeStream stage is only supported on replica sets" error when running MongoDB in docker在 docker 中运行 MongoDB 时出现“MongoError:$changeStream 阶段仅在副本集上受支持”错误
【发布时间】:2020-12-08 20:20:12
【问题描述】:

我在运行 MongoDB in docker 时遇到错误。当我运行我的 docker-composer 文件时。 node-app-setup 容器出现以下错误,我的 HTTP 服务器崩溃了。但是,我的 mongo-express 容器工作正常。另一方面。当我MongoDB atlas 时,错误消失了。我的应用 (node-app-setup) 运行良好。

我该如何解决这个问题?

来自 Docker 日志的错误消息:

> nodemon ./bin/www
[nodemon] 2.0.6
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node ./bin/www`
mongodb://db:27017/mydb?authSource=admin
Master 35 is running
test-app is listening on http://localhost:8089
connected mongoose

events.js:292
throw er; // Unhandled 'error' event
^

MongoError: The $changeStream stage is only supported on replica sets
at MessageStream.messageHandler (/usr/src/app/node_modules/mongodb/lib/cmap/connection.js:268:20)
at MessageStream.emit (events.js:315:20)
at processIncomingData (/usr/src/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (/usr/src/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
at writeOrBuffer (_stream_writable.js:352:12)
at MessageStream.Writable.write (_stream_writable.js:303:10)
at Socket.ondata (_stream_readable.js:719:22)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:309:12)
at readableAddChunk (_stream_readable.js:284:9)
at Socket.Readable.push (_stream_readable.js:223:10)
at TCP.onStreamRead (internal/stream_base_commons.js:188:23)
Emitted 'error' event on ChangeStream instance at:
at ChangeStream.<anonymous> (/usr/src/app/node_modules/mongoose/lib/cursor/ChangeStream.js:41:51)
at ChangeStream.emit (events.js:315:20)
at processError (/usr/src/app/node_modules/mongodb/lib/change_stream.js:571:38)
at ChangeStreamCursor.<anonymous> (/usr/src/app/node_modules/mongodb/lib/change_stream.js:435:5)
at ChangeStreamCursor.emit (events.js:315:20)
at /usr/src/app/node_modules/mongodb/lib/core/cursor.js:343:16
at /usr/src/app/node_modules/mongodb/lib/core/cursor.js:736:9
at /usr/src/app/node_modules/mongodb/lib/change_stream.js:329:9
at done (/usr/src/app/node_modules/mongodb/lib/core/cursor.js:458:7)
at /usr/src/app/node_modules/mongodb/lib/core/cursor.js:533:11
at executeCallback (/usr/src/app/node_modules/mongodb/lib/operations/execute_operation.js:70:5)
at callbackWithRetry (/usr/src/app/node_modules/mongodb/lib/operations/execute_operation.js:122:14)
at /usr/src/app/node_modules/mongodb/lib/operations/command_v2.js:88:9
at /usr/src/app/node_modules/mongodb/lib/cmap/connection_pool.js:348:13
at handleOperationResult (/usr/src/app/node_modules/mongodb/lib/core/sdam/server.js:558:5)
at MessageStream.messageHandler (/usr/src/app/node_modules/mongodb/lib/cmap/connection.js:268:11) {
ok: 0,
code: 40573,
codeName: 'Location40573'
}
[nodemon] app crashed - waiting for file changes before starting...

我的 Docker 编写代码:

version: '3.8'

networks:
  my-network-nodeApp:

services:

  db:
    container_name: mongo
    image: mongo:4.2.0
    restart: always
    ports:
     - 27017:27017
    # environment:
      # - MONGO_INITDB_ROOT_USERNAME=root
      # - MONGO_INITDB_ROOT_PASSWORD=example
    networks:
      - my-network-nodeApp

  db-mangement:
    container_name: mongo-express
    image: mongo-express
    restart: always
    depends_on:
      - db
    ports:
      - 8081:8081
    environment:
      # ME_CONFIG_MONGODB_ADMINUSERNAME: root
      # ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_SERVER: db
    networks:
      - my-network-nodeApp


  app:
    build:
      context: .
      dockerfile: ./docker/node/Dockerfile.Dev
    image: "node-app"
    depends_on: 
      - db
      - db-mangement
    container_name: "node-app-setup"
    restart: always
    # command: npm start
    ports:
      - "8089:8089"
    volumes:
      - ./:/usr/src/app
      # - /app/code/node_modules
    networks:
      - my-network-nodeApp

我的.env 变量:

MONGODB_HOST=mongodb://db:27017/mydb?authSource=admin

我的app.js数据库连接代码

const mongoose = require("mongoose");

console.log(process.env.MONGODB_HOST);

mongoose.connect(process.env.MONGODB_HOST, {
  useNewUrlParser: true,
  useFindAndModify: false,
  useUnifiedTopology: true,
});
const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function () {
  console.log("connected mongoose");
});

【问题讨论】:

  • 您无需在问题标题中添加!!! Help !!!。在这里提出问题,就表明您需要帮助。
  • 谢谢@mkrieger1
  • 按照错误消息的指示运行副本集。
  • @D.SM 你能给我一些资源吗?如何在 docker 中创建副本集?
  • 这可能在您找到创建现有部署的说明的同一位置进行了描述。

标签: node.js mongodb docker mongoose docker-compose


【解决方案1】:

我在模型文件中使用了watch()。我的代码是 -

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema(
  {
    email: {
      type: String,
      required: true,
    },
  },
  { timestamps: true }
);

const User = mongoose.model("User", userSchema);
User.watch().on("change", (data) => console.log(new Date(), data)); 
module.exports = User;

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema(
  {
    email: {
      type: String,
      required: true,
    },
  },
  { timestamps: true }
);

const User = mongoose.model("User", userSchema);
module.exports = User;

删除User.watch().on("change", (data) =&gt; console.log(new Date(), data)); 后。我的问题解决了。

谢谢

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多