Как настроить базу данных 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;
1 ответ
Хотя код подключения в первом поле кода кажется правильным, объект emailProvider не использует его. Вместо этого в app.js EmailProvider подключается к localhost:27017, а имя базы данных жестко закодировано в emailprovider.js как "localdb".
Вместо этого вы хотите использовать информацию о соединении, предоставленную в переменной среды MONGOLAB_URI в вашем EmailProvider, которая уже содержит имя хоста, порт и имя базы данных.
Есть несколько способов сделать это, но один из них - переместить код соединения из этого первого блока кода в конструктор EmailProvider, а затем изменить конструктор, чтобы он принимал URI вместо хоста и порта. Таким образом, вы можете передать переменную MONGOLAB_URI в конструктор в app.js.