node.js - error - ¿Cómo configuro la base de datos MongoDB en Heroku con MongoLab?
mongodb cloud (1)
Estoy usando Express.js y MongoLab y seguí la configuración de Heroku para hacer que MongoDB trabaje en producción lanzando este código en mi 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) {
});
});
});
y tengo las siguientes rutas y campos para mi formulario de correo electrónico (también en 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(''/'')
});
});
Esto representa el nuevo formulario en la página de índice y me permite guardarlo localmente pero no en producción porque no sé cómo configurar mi colección de correo electrónico. ¿Alguien puede guiarme a través de esto? nuevo para usar MongoDB y Node.js, así que podría necesitar algo de ayuda.
EDITAR:
En The MongoLab Database Interface, hice una collection
llamada emails
. ¿Es este el curso de acción correcto?
EDICION 2:
Aquí está definiendo EmailProvider en app.js junto con el archivo en sí.
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;
Mientras que el código de conexión en el primer cuadro de código parece ser correcto, el objeto emailProvider no lo está utilizando. En cambio, en app.js, EmailProvider se está conectando a localhost: 27017 y el nombre de la base de datos está codificado en emailprovider.js como ''localdb''.
Lo que quiere hacer en su lugar es usar la información de conexión proporcionada en la variable de entorno MONGOLAB_URI en su proveedor de correo electrónico, que ya contiene el nombre del host, el puerto y la base de datos.
Hay varias formas de hacerlo, pero una de ellas sería mover el código de conexión de la primera caja de códigos al constructor de EmailProvider y luego cambiar el constructor para que tome una URI en lugar de un host y un puerto. De esta forma, puede pasar la variable MONGOLAB_URI al constructor en app.js.