如何将 Micronaut API 连接到我的 MongoDB,即 docker 容器中的 运行?

How do I connect Micronaut API to my MongoDB that is running in my docker container?

我正在尝试将我的 Micronaut API 服务连接到我的 MongoDB,即 运行 在 docker 容器上。我按照本指南中的步骤为 MongoDB 创建身份验证,但是在 Micronaut 应用程序中创建客户端时,它说:

17:51:15.346 [pool-1-thread-1] ERROR c.ds.events.service.EventsService - com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='admin', source='admin', password=<hidden>, mechanismProperties=<hidden>}

我在 docker 中提取了最新的 mongo 图像并启动了服务并创建了一个这样的用户:

use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin",  
    roles: [
       { role: "userAdminAnyDatabase", db: "admin" },
    ]
  }
)

然后我关闭了 mongo 实例并使用身份验证凭据重新登录:

mongo -u admin -p admin --authenticationDatabase admin

我能够成功登录并且可以很好地将数据插入数据库。但是当尝试通过 Micronaut 连接到它时,我会收到身份验证错误。

这是我的 Micronaut API 应用程序的片段:

    @Value("${MONGO_PASS}")
    var pass: String = "admin"

    @Value("${MONGO_USER}")
    var user: String = "admin"

    @Value("${MONGO_HOST}")
    var host: String = "localhost"

    @Value("${MONGO_PORT}")
    var port: String = "27017"

    @Value("${MONGO_DB_NAME}")
    var database: String = "admin"

    @Value("${MONGO_COLLECTION}")
    var collectionName: String = "events"

    init {
        val client = KMongo.createClient(
                ServerAddress(host, port.toInt()),
                listOf(MongoCredential.createCredential(
                        user,
                        database,
                        pass.toCharArray()
                )),
                MongoClientOptions.builder().build())
        val database = client.getDatabase(database)
        collection = database.getCollection(collectionName)
    }

我没有设置任何环境变量,所以它应该使用默认值。以下是运行服务后的完整日志。

> Task :run
17:51:14.930 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 826ms. Server Running: http://localhost:8080
17:51:15.037 [pool-1-thread-1] INFO  org.mongodb.driver.cluster - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
17:51:15.055 [pool-1-thread-1] INFO  c.ds.events.service.EventsService - checking for events between 1573689074 and 1573692674
17:51:15.065 [cluster-ClusterId{value='5dcc96f3a49ea7512bce9dec', description='null'}-localhost:27017] INFO  org.mongodb.driver.connection - Opened connection [connectionId{localValue:1, serverValue:145}] to localhost:27017
17:51:15.068 [cluster-ClusterId{value='5dcc96f3a49ea7512bce9dec', description='null'}-localhost:27017] INFO  org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[4, 2, 1]}, minWireVersion=0, maxWireVersion=8, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=1864800}
17:51:15.346 [pool-1-thread-1] INFO  org.mongodb.driver.connection - Closed connection [connectionId{localValue:2}] to localhost:27017 because there was a socket exception raised by this connection.
17:51:15.346 [pool-1-thread-1] ERROR c.ds.events.service.EventsService - com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='admin', source='admin', password=<hidden>, mechanismProperties=<hidden>}
17:51:15.346 [pool-1-thread-1] INFO  class com.ds.events.jobs.EventsJob - No events in the time range to be sent to RabbitMQ

所以我想出了问题。 27017 端口上有其他进程 运行 导致了冲突。杀死端口上的所有进程并重新运行 docker 和 Micronaut 服务器解决了这个问题。