代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

Ruby Sinatra-在MongoHQ上连接MongoDB失败

  •  5
  • Michael Mao  · 技术社区  · 14 年前

    这只是我周末的项目/学习,我对Sinatra和MongoDB很陌生。

    我已经为MongoDB安装了gems,比如:Mongo、MongoMapper和MongoID。

    当我尝试从本地主机连接到MongoHQ上的数据库时,它遇到了这样一个错误:

    Mongo::ConnectionFailure at /
    failed to connect to any given host:port
    
        * file: connection.rb
        * location: connect
        * line: 489
    

    我发现 a similar thread on SO 但坦率地说,我不太明白答案…

    这是我的代码段:

    require 'rubygems'
    require 'sinatra'
    require 'mongo'
    require 'mongo_mapper'
    
    get '/' do
      MongoMapper.connection = Mongo::Connection.new('flame.mongohq.com', 27044)
      MongoMapper.database = 'notes'
      MongoMapper.database.authenticate('foo', 'bar')
      erb :list
    end
    

    我把上面的代码从 here 但似乎不起作用…

    哪一部分错了?还有别的办法吗?最后,这个测试Web应用程序将被部署到Heroku上,所以我希望这个解决方案能够与本地主机和我的Heroku服务器一起工作。

    更新:

    I just created a minimal code snippet to test the mongodb connection:
    require 'rubygems'
    require 'mongo'
    
    db = Mongo::Connection.new("flame.mongohq.com", 27044).db("notes")
    

    但在超时后仍然出现错误:

    $ ruby mongodbtest.rb 
    /Library/Ruby/Gems/1.8/gems/mongo-1.0.8/lib/../lib/mongo/connection.rb:489:in
    `connect': failed to connect to any given host:port (Mongo::ConnectionFailure)
    from /Library/Ruby/Gems/1.8/gems/mongo-1.0.8/lib/../lib/mongo/connection.rb:137:in
    `initialize'
    from mongodbtest.rb:4:in `new'
    from mongodbtest.rb:4
    

    主机名和端口根据MongoHQ文档,因此它们必须是正确的。

    感谢您的帮助。

    第二更新 :

    我刚刚用终端测试了mongodb连接字符串:

    mongo mongodb://flame.mongohq.com:27044/notes -u foo -p bar
    

    不幸的是,这会给我一个连接失败的错误,老实说,我不知道为什么…

    2 回复  |  直到 13 年前
        1
  •  8
  •   Steve Wilhelm    14 年前

    我用

    uri =  URI.parse(ENV['MONGOHQ_URL'])
    @mongo_connection = Mongo::Connection.from_uri( uri )
    @mongo_db = @mongo_connection.db(uri.path.gsub(/^\//, ''))
    @mongo_db.authenticate(uri.user, uri.password)
    

    您可以使用 heroku config --long 命令

        2
  •  0
  •   Michael Mao    14 年前

    我又试了一次,这次我用的是ping的IP地址:

    所以,如果我改变:

    db = Mongo::Connection.new('flame.mongohq.com', 27060).db("notes")
    db.authenticate('fake', 'info')
    

    到:

    db = Mongo::Connection.new('184.73.224.5', 27060).db("notes")
    db.authenticate('fake', 'info')
    

    那就行了…

    我仍然不明白为什么域名方法不起作用,但至少我可以完成这一点:)