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_SECRET
和SECRET_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&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 在读取期间导致异常
Kotlin Spring Boot bean 验证不起作用
12月编程语言排行:Kotlin和C成年度编程语言“候选人”;MongoDB泄露三千万用户信息;TensorFlow 1.4.1