MongoDB 数据库不是在 Kotlin(Ktor) 中创建的

Posted

技术标签:

【中文标题】MongoDB 数据库不是在 Kotlin(Ktor) 中创建的【英文标题】:MongoDB Database is not created in Kotlin(Ktor) 【发布时间】:2021-09-30 15:33:50 【问题描述】:

请帮助我将 mongodb 连接到我的 ktor 应用程序。 这是我拥有的代码,来自这篇文章:https://himanshoe.com/mongodb-in-ktor

class MongoDataHandler 

val client = KMongo.createClient().coroutine
val database = client.getDatabase("dev")
val userCollection = database.getCollection<User>()

suspend fun adduser(email: String, username: String, password: String): User? 
userCollection.insertOne(User(userId = null, email = email, userName = username, passwordHash = password))
return userCollection.findOne(User::email eq email )

suspend fun finduser(id: String): User?
return userCollection.findOneById(id)


我按照他们网站的指示安装了 mongodb。成功安装后,mongodb 将作为服务启动。我运行此命令“C:\Program Files\MongoDB\Server\5.0\bin\mongo.exe”来使用 mongodb。当我使用“show dbs”检查可用的数据库时,我意识到我的数据库(dev)没有列出。 这是正在使用的依赖项:

implementation("org.litote.kmongo:kmongo-coroutine:4.2.8")

这是我得到的错误:

[eventLoopGroupProxy-4-1] INFO  Application - 500 Internal Server Error: 
POST - /user

我想我做错了什么......提前谢谢

【问题讨论】:

您是否能够在没有 Ktor 的情况下连接到 MongoDB 数据库?如果是这样,请分享一个完整项目的代码。 是的,我可以在没有 Ktor 的情况下连接到 mongodb。这是项目的链接.. github.com/Toluxpersia/Link.. 谢谢 如果我在使用有效值运行应用程序时传递了环境变量JWT_SECRETSECRET_KEY,那么java.lang.IllegalStateException: generation for id property type not supported : class kotlin.Int 会在adduser 方法中抛出。 另外,请确保您使用Content-type: application/x-www-form-urlencoded 发送请求。 您可以尝试对 JWT_SCRETE 和 SECRET_KEY 常量使用字符串变量吗?我使用 Postman 适当地提出请求。但最终,我是否正确地创建和初始化了数据库? 【参考方案1】:

尝试使用 MongoClients.create() 方法将您的 MongoDataHandler 更改为以下内容,并向您的客户端添加 codecRegistry。

如果您使用默认设置的本地连接,则不需要连接字符串设置:

class MongoDataHandler 
    private val database: MongoDatabase
    private val usersCollection: MongoCollection<User>

    init 
        val pojoCodecRegistry: CodecRegistry = fromProviders(
            PojoCodecProvider.builder()
                .automatic(true)
                .build()
        )

        val codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry)
        val settings: MongoClientSettings = MongoClientSettings.builder()
//            .applyConnectionString("localhost") => add the connection string if not using localhost
            .codecRegistry(codecRegistry)
            .build()

        val mongoClient = MongoClients.create(settings)
        database = mongoClient.getDatabase("dev")
        usersCollection = database.getCollection(User::class.java.name, User::class.java)

    

另外,如果您不使用 docker,请尝试使用 docker-compose 来编排您的 mongodb 容器:

version: '3'
services:
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"

如果您想使用 Ktor/MongoDB 运行示例,请查看project

【讨论】:

【参考方案2】:

我假设您处于开发模式并在我们的本地计算机上尝试此操作。

确保您在本地机器上安装了 MongoDB,并且本地服务器运行良好。 Here 是 ubuntu 的指南。

MongoDB安装成功后,运行此命令mongo --eval 'db.runCommand( connectionStatus: 1 )'

输出应包含如下一行:connecting to : mongodb://127.0.0.1:27017/?compressors=disabled&amp;gssapiServiceName=mongodb

确保在ConnectionString 中创建客户端时添加此行,例如:\

private val client = KMongo.createClient(
    ConnectionString("mongodb://127.0.0.1:27017")
).coroutine

然后尝试使用 Ktor 处理您的请求/操作,它应该可以正常工作。

【讨论】:

以上是关于MongoDB 数据库不是在 Kotlin(Ktor) 中创建的的主要内容,如果未能解决你的问题,请参考以下文章

将 mongodb 聚合查询翻译成 Java/Kotlin Spring Data

使用 Kotlin 的 spring-data-mongodb 上的 @Transient 在读取期间导致异常

6.3 Spring Boot集成mongodb开发

Kotlin Spring Boot bean 验证不起作用

12月编程语言排行:Kotlin和C成年度编程语言“候选人”;MongoDB泄露三千万用户信息;TensorFlow 1.4.1

SailsJS 是在视图中显示所有 mongodb 集合的最佳方式