Как настроить базу данных MongoDB на Heroku с помощью MongoLab?

Я использую 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 я создал collection с именем emails. Это правильный образ действий?

РЕДАКТИРОВАТЬ 2:

Вот определение EmailProvider в app.js вместе с самим файлом.

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;

person Jryl    schedule 21.05.2013    source источник
comment
Привет! Кажется, не хватает контекста. Ваш код подключения к MongoDB выглядит нормально, но каково определение emailProvider?   -  person robert    schedule 21.05.2013
comment
@robert Хорошо, я отредактировал, чтобы было понятнее, что происходит.   -  person Jryl    schedule 21.05.2013
comment
Я правильно понимаю, что ваш EmailProvider подключается к localhost:27017? Вместо этого вы пытаетесь подключить его к своей базе данных MongoLab?   -  person robert    schedule 21.05.2013
comment
@robert Да, я хочу подключить его к MongoLab или Heroku.   -  person Jryl    schedule 21.05.2013
comment
Хорошо, показанный код подключается к базе данных по адресу localhost:27017/localdb, и все настройки в вашем первом блоке кода игнорируются. Я бы начал с изменения конструктора EmailProvider, чтобы он принимал URI вместо хоста и порта, и переместил туда правильную логику подключения, которую вы показываете в первом блоке кода. Затем в app.js передайте конструктору MONGOLAB_URI вместо localhost и 27017.   -  person robert    schedule 21.05.2013
comment
Ссылка (devcenter.heroku.com/articles/nodejs#using-mongodb ) больше не работает. Новая страница: elements.heroku.com/addons/#data-stores.   -  person Ryan    schedule 12.02.2016


Ответы (1)


Хотя код подключения в первом поле кода кажется правильным, объект emailProvider его не использует. Вместо этого в app.js EmailProvider подключается к localhost:27017, а имя базы данных жестко запрограммировано в emailprovider.js как «localdb».

Вместо этого вы хотите использовать информацию о соединении, предоставленную в переменной среды MONGOLAB_URI в вашем EmailProvider, которая уже содержит хост, порт и имя базы данных.

Есть несколько способов сделать это, но один из них — переместить код подключения из этого первого блока кода в конструктор EmailProvider, а затем изменить конструктор так, чтобы он принимал URI вместо хоста и порта. Таким образом, вы можете передать переменную MONGOLAB_URI конструктору в app.js.

person robert    schedule 21.05.2013