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

7
我正在使用Express.js和MongoLab,并且我遵循了Heroku设置使MongoDB在生产环境中工作,将以下代码添加到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数据库界面中,我创建了一个名为“emails”的集合。这是正确的操作吗?
编辑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;

1
嗨!似乎缺少一些上下文。你的MongoDB连接代码看起来很好,但是emailProvider的定义是什么? - robert
@robert 好的,我已经编辑过了,让它更容易理解正在发生什么。 - Jryl
1
我读得对吗,你的EmailProvider正在连接到localhost:27017?你是想将它连接到你的MongoLab数据库吗? - robert
@robert 是的,我想将它连接到MongoLab或Heroku上。 - Jryl
1
好的,那么如所示的代码正在连接到localhost:27017/localdb上的数据库,并且在您的第一个代码块中设置的所有内容都被忽略了。我建议首先将EmailProvider构造函数更改为使用URI而不是主机和端口,并将您在第一个代码块中显示的正确连接逻辑移入其中。然后,在app.js中,将MONGOLAB_URI传递给构造函数,而不是'localhost'和27017。 - robert
链接(https://devcenter.heroku.com/articles/nodejs#using-mongodb)已不可用。新页面为https://elements.heroku.com/addons/#data-stores。 - Ryan
1个回答

6
虽然第一个代码框中的连接代码似乎是正确的,但emailProvider对象没有使用它。相反,在app.js中,EmailProvider被连接到localhost:27017,并且数据库名称在emailprovider.js中硬编码为'localdb'。
相反,您要做的是在EmailProvider中使用MONGOLAB_URI环境变量提供的连接信息,其中已包含主机,端口和数据库名称。
有很多方法可以实现这一点,但其中一种方法是将连接代码从第一个代码框移到EmailProvider构造函数中,然后更改构造函数使其接受URI而不是主机和端口。这样,您可以将MONGOLAB_URI变量传递给app.js中的构造函数。

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