2013-05-21 16 views
7

Używam Express.js i MongoLab, a ja podążam za Heroku setup to get MongoDB working w produkcji, rzucając ten kod w moim app.js.Jak skonfigurować bazę danych MongoDB na Heroku z MongoLab?

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

i mam następujące trasy i pole dla mojej postaci poczty elektronicznej (także w 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('/') 
    }); 
}); 

Czyni to nowy formularz na stronie indeksu i pozwala mi zapisać go lokalnie, ale nie w produkcji, ponieważ nie wiem, jak skonfigurować moją kolekcję e-maili. Czy ktoś może mnie przez to przechodzić? całkowicie nowy w użyciu MongoDB i Node.js, więc może skorzystać z pomocy.

EDIT:

w interfejsie MongoLab Database, zrobiłem collection nazywa emails. Czy to właściwy kierunek działania?

EDIT 2:

Tutaj jest zdefiniowanie EmailProvider w app.js wraz z samym pliku.

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

Witam! Wygląda na to, że brakuje jakiegoś kontekstu. Twój kod połączenia MongoDB wygląda dobrze, ale jaka jest definicja usługi emailProvider? – robert

+0

@robert OK, zredagowałem, aby było bardziej zrozumiałe, co się dzieje. – Jryl

+1

Czy poprawnie czytam, że twój EmailProvider łączy się z localhost: 27017? Czy zamiast tego próbujesz połączyć się z bazą danych MongoLab? – robert

Odpowiedz

6

Chociaż kod gra w pierwszym polu kodu wydaje się być poprawne, obiekt emailProvider nie jest go za pomocą . Zamiast tego, w app.js, EmailProvider jest połączony z localhost: 27017, a nazwa bazy danych jest zakodowana w pliku emailprovider.js jako "localdb".

Zamiast tego należy użyć informacji o połączeniu podanych w zmiennej środowiskowej MONGOLAB_URI w aplikacji EmailProvider, która zawiera już nazwę hosta, port i nazwę bazy danych.

Istnieje wiele sposobów na zrobienie tego, ale jednym ze sposobów byłoby przeniesienie kodu połączenia z tego pierwszego pola kodu do konstruktora EmailProvider, a następnie zmiana konstruktora tak, aby pobierał identyfikator URI zamiast host i port. W ten sposób można przekazać zmienną MONGOLAB_URI do konstruktora w app.js.