MongoError:身份验证失败。猫鼬

时间:2021-06-01 01:15:08

标签: node.js mongodb docker mongoose

我正在我的机器上运行一个节点和 mongodb docker 应用程序,但是当我尝试使用 moogose 连接到数据库时,它返回:

MongoError: Authentication failed.
    at MessageStream.messageHandler (D:\Node\08-multi-dbb-mongodb\node_modules\mongodb\lib\cmap\connection.js:272:20)
    at MessageStream.emit (events.js:223:5)
    at processIncomingData (D:\Node\08-multi-dbb-mongodb\node_modules\mongodb\lib\cmap\message_stream.js:144:12)
    at MessageStream._write (D:\Node\08-multi-dbb-mongodb\node_modules\mongodb\lib\cmap\message_stream.js:42:5)
    at doWrite (_stream_writable.js:435:12)
    at writeOrBuffer (_stream_writable.js:419:5)
    at MessageStream.Writable.write (_stream_writable.js:309:11)
    at Socket.ondata (_stream_readable.js:728:22)
    at Socket.emit (events.js:223:5)
    at addChunk (_stream_readable.js:309:12)
    at readableAddChunk (_stream_readable.js:290:11)
    at Socket.Readable.push (_stream_readable.js:224:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:181:23) {
  ok: 0,
  code: 18,
  codeName: 'AuthenticationFailed',
  name: 'MongoError'
}

这是我建立连接的方式: 文件名:mongodb.js

const mongoose = require('mongoose')
mongoose.connect('mongodb://user:password@localhost:27017/dbname', 
    {useNewUrlParser: true, useUnifiedTopology: true}, function (error){
        if(!error) return;
        console.log('Falha na conexao!', error)
    }
)

const connection = mongoose.connection
connection.once('open', () => console.log('database rodando!!'))

我可以通过客户端(可视化界面)访问数据库,也可以通过终端连接数据库,例如

docker exec -it 347b053d4320 mongo -u user -p password --authenticationDatabase myDb

但是当我尝试运行 mongodb.js 文件的代码时,它返回错误。

如果你能出于好意帮助我。

谢谢!

1 个答案:

答案 0 :(得分:0)

这完全取决于您从何处建立连接以及您的 Docker 配置是什么样的。

单独的 Docker 容器

假设你在一个 Docker 容器中有 Mongo,在另一个 Docker 容器中有 NodeJS。

如果您从 NodeJS 进行连接,那么 Mongo 不会在本地主机上运行。

NodeJS 和 Mongo 在单独的容器中,但在同一个 docker-compose 文件中

再次从 NodeJS 的角度来看,Mongo 不是在 localhost 上运行,而是在 docker-compose 中的服务上运行

示例

version: '3.7'

services:

  myapp:
    image: img_myapp:latest
    build:
      context: ./build/
    container_name: myapp
    depends_on:
      - database
    ports:
      - "8091:80"
    networks:
      - myapp-network

  database:
    image: 'mongo'
    container_name: 'mongo'
    environment:
      MONGO_INITDB_DATABASE: mydb
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    ports: 
      - "27999:27017"
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
    volumes:
      - ./database:/data/db
    networks:
      - myapp-network


networks:
  myapp-network:

在上面的配置中你连接到 mongodb://root:root@database:27999/mydb

在容器中运行 Mongo,在主机上运行 NodeJS

在这种情况下,如果 mongo-container 发布了它的端口,你就可以连接到 localhost。它在上面的 yml 中做了什么:端口 27999