2013-05-21 19 views
7

Sto usando Express.js e MongoLab e ho seguito lo Heroku setup to get MongoDB working in produzione lanciando questo codice nel mio app.js.Come posso impostare il database MongoDB su Heroku con 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) { 
    }); 
    }); 
}); 

e ho le seguenti percorsi e campi per il mio modulo e-mail (anche 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('/') 
    }); 
}); 

Ciò rende il nuovo modulo nella pagina indice e mi permette di salvare in locale, ma non in produzione perché non so come impostare la mia raccolta di email. Qualcuno può camminarmi attraverso questo? nuovo di zecca per l'utilizzo di MongoDB e Node.js, quindi potrebbe essere utile.

EDIT:

Nel MongoLab interfaccia Database, ho fatto un collection chiamato emails. È questa la giusta linea d'azione?

EDIT 2:

Ecco la definizione EmailProvider in app.js insieme al file stesso.

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

Ciao! Sembra che manchi qualche contesto. Il tuo codice di connessione MongoDB sembra buono, ma qual è la definizione di emailProvider? – robert

+0

@robert OK, ho modificato per rendere più comprensibile quello che sta succedendo. – Jryl

+1

Sto leggendo correttamente che il tuo EmailProvider si connette a localhost: 27017? Stai invece cercando di collegarlo al tuo database MongoLab? – robert

risposta

6

Mentre il codice di connessione nella prima casella codice sembra essere corretta, l'oggetto emailProvider non sta usando . Invece, in app.js, EmailProvider è connesso a localhost: 27017 e il nome del database è hardcoded in emailprovider.js come "localdb".

Quello che si vuole invece è usare le informazioni di connessione fornite nella variabile d'ambiente MONGOLAB_URI nel proprio EmailProvider, che contiene già l'host, la porta e il nome del database.

Ci sono diversi modi per farlo, ma un modo sarebbe spostare il codice di connessione da quella prima casella di codice al costruttore di EmailProvider e quindi cambiare il costruttore in modo che richieda un URI invece di un host e porto. In questo modo, puoi passare la variabile MONGOLAB_URI al costruttore in app.js.

Problemi correlati