2013-05-21 79 views
7

我使用Express.js和MongoLab和我跟着生產Heroku setup to get MongoDB working在我app.js拋出此代碼。如何使用MongoLab在Heroku上設置MongoDB數據庫?

//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數據庫接口,我做了一個名爲collectionemails。這是正確的行動方針嗎?

編輯2:

這裏與文件本身沿着限定在app.js EmailProvider。

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

嗨!似乎有一些背景缺失。你的MongoDB連接代碼看起來很好,但是emailProvider的定義是什麼? – robert

+0

@robert好吧,我編輯了一下,讓它更容易理解發生了什麼。 – Jryl

+1

我正確讀取您的EmailProvider連接到本地主機:27017?你是否試圖將它連接到你的MongoLab數據庫? – robert

回答

6

雖然在第一碼框連接碼似乎是正確的,則emailProvider對象不使用它。相反,在app.js的EmailProvider被連接到本地主機:27017和數據庫名稱在emailprovider.js爲「的LocalDB」硬編碼。

你想要做的,而不是什麼是使用你的EmailProvider,其中包含了主機,端口和數據庫名稱已經在MONGOLAB_URI環境變量中提供的連接信息。

有許多的方法去這樣做,但一個方法是從第一代碼框中插入EmailProvider構造移動你的連接代碼,然後更改構造函數,因此,它需要一個URI,而不是主機和端口。這樣,您可以將MONGOLAB_URI變量傳遞給app.js中的構造函數。

相關問題