2013-05-21 7 views
7

Ich benutze Express.js und MongoLab und ich folgte der Heroku setup to get MongoDB working in Produktion warf diesen Code in meinem app.js.Wie richte ich die MongoDB-Datenbank auf Heroku mit MongoLab ein?

//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) { 
    }); 
    }); 
}); 

und ich habe über die folgenden Routen und Feld für mein E-Mail-Formular (auch in 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('/') 
    }); 
}); 

Dieser das neue Formular auf der Indexseite macht und läßt ich es lokal speichern, aber nicht in Produktion, weil ich nicht weiß, wie ich meine E-Mail-Sammlung einrichten soll. Kann mir jemand das erklären? völlig neu in der Verwendung von MongoDB und Node.js, könnte also Hilfe gebrauchen.

EDIT:

Im MongoLab Datenbank-Schnittstelle, machte ich ein collectionemails genannt. Ist das die richtige Vorgehensweise?

EDIT 2:

Hier ist die Definition EmailProvider in app.js zusammen mit der Datei selbst.

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

Hallo! Es scheint ein Kontext zu fehlen. Ihr MongoDB-Verbindungscode sieht gut aus, aber wie lautet die Definition von emailProvider? – robert

+0

@robert OK, ich habe es bearbeitet, um es verständlicher zu machen, was vor sich geht. – Jryl

+1

Liest ich korrekt, dass Ihr EmailProvider eine Verbindung zu localhost: 27017 herstellt? Versuchen Sie, es stattdessen mit Ihrer MongoLab-Datenbank zu verbinden? – robert

Antwort

6

Während der Verbindungscode in der ersten Code-Box korrekt zu sein scheint, das emailProvider Objekt nicht verwenden . Stattdessen wird in App.js der EmailProvider mit localhost: 27017 verbunden und der Datenbankname ist in emailprovider.js als 'localdb' fest codiert.

Sie möchten stattdessen die Verbindungsinformationen in der Umgebungsvariablen MONGOLAB_URI in Ihrem EmailProvider verwenden, die bereits den Host-, Port- und Datenbanknamen enthalten.

Es gibt mehrere Möglichkeiten, dies zu tun, aber eine Möglichkeit wäre, Ihren Verbindungscode von diesem ersten Code-Feld in den EmailProvider-Konstruktor zu verschieben und dann den Konstruktor zu ändern, so dass ein URI statt eines Host und Port. Auf diese Weise können Sie die Variable MONGOLAB_URI an den Konstruktor in app.js übergeben.