无法使用salat从play应用程序连接到MongoDB:命令失败[listDatabases]

3

我正在尝试在playframework中使用salat插件。 我已经在application.conf中配置了数据库,并在Build.scala中添加了所有依赖项,并将salat添加到play.plugins文件中。 实际上,我还没有向项目添加任何代码,只是按照github页面上的说明进行操作,然后尝试运行项目。 我收到以下错误消息:

(服务器已启动,使用 Ctrl+D 停止并返回控制台...)
[info] play - mongodb [default] 已连接到 heroku_app4620908@ds031907.mongolab.com:31907/heroku_app4620908 [error] application -
! @6bchnaacn - 内部服务器错误,对于请求 [GET /] -> play.api.Configuration$$anon$1:配置错误[couldn't connect to [ds031907.mongolab.com/107.21.153.211:31907]] at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:71) ~[play_2.9.1-2.0.3.jar:2.0.3] at play.api.Configuration.reportError(Configuration.scala:258) ~[play_2.9.1-2.0.3.jar:2.0.3] at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:105) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8] at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:98) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.3] at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.3] 导致原因:com.mongodb.CommandResult$CommandFailure: command failed [listDatabases]: { "serverUsed" : "db-uri" , "errmsg" : "need to login" , "ok" : 0.0} at com.mongodb.CommandResult.getException(CommandResult.java:88) ~[mongo-java-driver-2.8.0.jar:na at com.mongodb.CommandResult.throwOnError(CommandResult.java:134) ~[mongo-java-driver-2.8.0.jar:na] at com.mongodb.Mongo.getDatabaseNames(Mongo.java:356) ~[mongo-java-driver-2.8.0.jar:na] at com.mongodb.casbah.MongoConnection.getDatabaseNames(MongoConnection.scala:190) ~[casbah-core_2.9.1-2.4.1.jar:2.4.1] at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:103) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8] at se.radley.plugin.salat.SalatPlugin$$anonfun$onStart$1.apply(SalatPlugin.scala:98) ~[play-plugins-salat_2.9.1-1.0.8.jar:1.0.8]

我感到困惑,因为我已经将我的密码和所有信息添加到配置文件中。从日志中看,似乎任何尝试连接数据库的东西都没有先登录,也没有使用我提供的信息。

4个回答

6
正如你所说,问题似乎是MongoDB拒绝了“listDatabases”命令。这个命令需要管理员权限才能执行,因为它会显示有关托管在其中的其他数据库的信息。
不幸的是,它返回的信息:“需要登录”,有点误导人。你已经登录了!只是没有权限列出数据库。
以下是一个使用MongoDB shell进行简单实验的方式。可以看到,“show dbs”失败并返回与应用程序中得到的相同错误消息,但“show collections”成功,因为它不需要访问任何其他数据库。
% mongo ds031907.mongolab.com:31907/heroku_app4620908 -u heroku_app4620908 -p your_password
MongoDB shell version: 2.0.7
connecting to: ds031907.mongolab.com:31907/heroku_app4620908
> show dbs
Fri Aug 17 13:12:10 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }
> show collections
system.indexes
system.users

(注意:我使用了自己的MongoLab账户,并在复制和粘贴文本时进行了修改,以便您可以将其直接复制到终端中。)
有没有办法避免调用listDatabases方法?我不熟悉您使用的框架。

好的,谢谢。我想那一定是问题所在,我正在努力尝试找出如何修复它的方法。 - wfbarksdale

2
我也有这个问题...
应该在SalatPlugin的onStart方法中请求所有数据库名称:source._2.connection.getDatabaseNames()
这段代码只是测试服务器的活性...
我将与Leon核对我们如何以不同的方式解决这个问题!不幸的是,在这个问题得到解决之前,您将无法连接!
请关注此问题:https://github.com/leon/play-salat/issues/23

我真的很想下载这个项目并尝试自己修复,但是我对sbt感到有些困惑,不知道如何从源代码构建。http://stackoverflow.com/questions/12021538/how-can-i-build-a-plugin-from-source-and-use-it-in-my-play-app - wfbarksdale
我能否在全局的 onStart 方法中配置插件? - wfbarksdale
很遗憾,因为全局onStart方法是在插件之后运行的...这很合乎逻辑。此外,这种特定行为无法使用配置解决 :( - Andy Petrella

0

使用管理员权限

db.addUser('用户名', '用户密码')

db.auth('用户名', '用户密码')

显示数据库列表

Java代码:

DB db = mongo.getDB("你的数据库名称") ;

db.authenticate("用户名", "用户密码".toCharArray()) ;

System.out.println(mongo.getDatabaseNames()) ;


0

这个问题在最新版本的play-salat中已经被修复了,现在使用getCollectionNames代替


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接