【问题标题】:MongoError: Authentication failed. MongooseMongoError:身份验证失败。猫鼬
【发布时间】:2021-06-01 01:15:08
【问题描述】:

我正在我的机器上运行一个节点和 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 文件的代码时,它会返回错误。

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

谢谢!

【问题讨论】:

    标签: node.js mongodb docker mongoose


    【解决方案1】:

    这一切都取决于您从哪里建立连接以及您的 Docker 配置是什么样的。

    独立的 Docker 容器

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

    如果你从 NodeJS 进行连接,那么 Mongo 不会在 localhost 上运行。

    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

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2016-04-07
      • 1970-01-01
      • 2021-06-18
      • 2016-01-01
      • 1970-01-01
      • 2021-04-24
      • 2018-11-27
      • 2012-01-07
      相关资源
      最近更新 更多