如何使用 MongoLab 在 Heroku 上设置 MongoDB 数据库?

Posted

技术标签:

【中文标题】如何使用 MongoLab 在 Heroku 上设置 MongoDB 数据库?【英文标题】:How do I setup MongoDB database on Heroku with MongoLab? 【发布时间】:2013-05-15 15:50:55 【问题描述】:

我正在使用 Express.js 和 MongoLab,我在生产中遵循 Heroku setup to get MongoDB working 将这段代码扔到我的 app.js 中。

//Mongo on Heroku Setup
var mongo = require('mongodb');

var mongoUri = process.env.MONGOLAB_URI || 
  process.env.MONGOHQ_URL || 
  'mongodb://localhost/mydb'; 

mongo.Db.connect(mongoUri, function (err, db) 
  db.collection('mydocs', function(er, collection) 
    collection.insert('mykey': 'myvalue', safe: true, function(er,rs) 
    );
  );
);

我的电子邮件表单(也在 app.js 中)有以下路由和字段:

//Routes

app.get('/', function(req, res) 
    res.render('index', 
        title: 'DumbyApp'
    );
);

//save new email
app.post('/', function(req, res)
    emailProvider.save(
        address: req.param('address')
    , function( error, docs) 
        res.redirect('/')
    );
);

这会在索引页面上呈现新表单,并让我将其保存在本地,但不能保存在生产环境中,因为我不知道如何设置我的电子邮件集合。谁能帮我完成这个?使用 MongoDB 和 Node.js 的新手,所以可以使用一些帮助。

编辑:

在 MongoLab 数据库界面中,我创建了一个名为 emailscollection。这是正确的做法吗?

编辑 2:

这里在 app.js 中定义 EmailProvider 以及文件本身。

app.js

 var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , EmailProvider = require('./emailprovider').EmailProvider;

var emailProvider= new EmailProvider('localhost', 27017);

emailprovider.js

var Db = require('mongodb').Db;
var Connection = require('mongodb').Connection;
var Server = require('mongodb').Server;
var BSON = require('mongodb').BSON;
var ObjectID = require('mongodb').ObjectID;

EmailProvider = function(host, port) 
  this.db= new Db('localdb', new Server(host, port, safe: false, auto_reconnect: true, ));
  this.db.open(function());
;


EmailProvider.prototype.getCollection= function(callback) 
  this.db.collection('emails', function(error, email_collection) 
    if( error ) callback(error);
    else callback(null, email_collection);
  );
;

//save new email
EmailProvider.prototype.save = function(emails, callback) 
    this.getCollection(function(error, email_collection) 
      if( error ) callback(error)
      else 
        if( typeof(emails.address)=="undefined")
          emails = [emails];

        for( var i =0;i< emails.address;i++ ) 
          email = emails[i];
          email.created_at = new Date();
        

        email_collection.insert(emails, function() 
          callback(null, emails);
        );
      
    );
;

exports.EmailProvider = EmailProvider;

【问题讨论】:

嗨!似乎缺少一些上下文。您的 MongoDB 连接代码看起来不错,但是 emailProvider 的定义是什么? @robert 好的,我进行了编辑以使其更容易理解正在发生的事情。 我是否正确阅读了您的 EmailProvider 正在连接到 localhost:27017?您是否尝试将其连接到您的 MongoLab 数据库? @robert 是的,我想将它连接到 MongoLab 或 Heroku。 好的,如图所示的代码正在连接到位于 localhost:27017/localdb 的数据库,并且您的第一个代码块中的所有设置都将被忽略。我将首先更改 EmailProvider 构造函数以采用 URI 而不是主机和端口,并将您在第一个代码块中显示的正确连接逻辑移动到那里。然后,在 app.js 中,将 MONGOLAB_URI 传递给构造函数,而不是 'localhost' 和 27017。 【参考方案1】:

虽然第一个代码框中的连接代码看起来是正确的,但 emailProvider 对象并未使用它。相反,在 app.js 中,EmailProvider 连接到 localhost:27017,并且数据库名称在 emailprovider.js 中硬编码为“localdb”。

您想要做的是使用您的 EmailProvider 中 MONGOLAB_URI 环境变量中提供的连接信息,其中已经包含主机、端口和数据库名称。

有很多方法可以做到这一点,但一种方法是将您的连接代码从第一个代码框移动到 EmailProvider 构造函数中,然后更改构造函数,使其采用 URI 而不是主机和港口。这样,您可以将 MONGOLAB_URI 变量传递给 app.js 中的构造函数。

【讨论】:

以上是关于如何使用 MongoLab 在 Heroku 上设置 MongoDB 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 使用 mongolab 插件到 Heroku?

如何使用 MongoLab 在 Heroku 上设置 MongoDB 数据库?

如何使用 MongoLab 在 Heroku 上设置 MongoDB 数据库?

无法在 heroku 上使用 node.js 连接到 mongolab

mongolab和heroku之间的连接需要ssl吗?

Heroku 上的 Node.js Express 应用程序不会使用 Mongoose 连接到 MongoLab 数据库