2013-10-12 28 views
1

我試圖做同樣的事情這傢伙的在這裏做How do I setup MongoDB database on Heroku with MongoLab?從MongoDB中去MongoLab如何使用Node.js

應用程序是否運行在Amazon EC2上,我部署到Heroku的與MongoLabs附加。

我應該輸入什麼來改變mongo連接到Mongo URI?

Heroku的文檔

/** https://devcenter.heroku.com/articles/getting-started-with-nodejs#write-your-app */ 

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

/** app.js */ 

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , EmployeeProvider = require('./employeeprovider').EmployeeProvider; 

var app = express(); 

app.configure(function(){ 
    app.set('port', process.env.PORT || 8080); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.set('view options', {layout: false}); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(require('stylus').middleware(__dirname + '/public')); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

var employeeProvider= new EmployeeProvider('localhost', 27017); 

//Routes 

app.get('/', function(req, res){ 
    employeeProvider.findAll(function(error, emps){ 
     res.render('index', { 
      title: 'Employees', 
      employees:emps 
     }); 
    }); 
}); 

app.get('/employee/new', function(req, res) { 
    res.render('employee_new', { 
     title: 'New Employee' 
    }); 
}); 

//save new employee 
app.post('/employee/new', function(req, res){ 
    employeeProvider.save({ 
    title: req.param('title'), 
     name: req.param('name') 
    }, function(error, docs) { 
     res.redirect('/') 
    }); 
}); 

app.listen(8080); 

employeeprovider.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; 

EmployeeProvider = function(host, port) { 
    this.db= new Db('node-mongo-employee', new Server(host, port, {safe: true},   {auto_reconnect: true}, {})); 
    this.db.open(function(){}); 
}; 


EmployeeProvider.prototype.getCollection= function(callback) { 
    this.db.collection('employees', function(error, employee_collection) { 
    if(error) callback(error); 
    else callback(null, employee_collection); 
    }); 
}; 

//find all employees 
EmployeeProvider.prototype.findAll = function(callback) { 
    this.getCollection(function(error, employee_collection) { 
     if(error) callback(error) 
     else { 
     employee_collection.find().toArray(function(error, results) { 
      if(error) callback(error) 
      else callback(null, results) 
     }); 
     } 
    }); 
}; 

//save new employee 
EmployeeProvider.prototype.save = function(employees, callback) { 
    this.getCollection(function(error, employee_collection) { 
     if(error) callback(error) 
     else { 
     if(typeof(employees.length)=="undefined") 
      employees = [employees]; 

     for(var i =0;i< employees.length;i++) { 
      employee = employees[i]; 
      employee.created_at = new Date(); 
     } 

     employee_collection.insert(employees, function() { 
      callback(null, employees); 
     }); 
     } 
    }); 
}; 

exports.EmployeeProvider = EmployeeProvider; 

我將如何改變employeeProvider使用URI,而不是本地主機?

+0

有一個例子:https://github.com/mongolab/mongodb-driver-examples /blob/master/nodejs/nodeSimpleExample.js – nha

回答

0

我用MongoHQ但其類似的,首先你需要爲你的數據庫中創建用戶插件,然後添加憑據URI(你應該看到URI在蒙戈插件) 例如:

的MongoDB: //user:[email protected]:10000/app12345678

+0

感謝Leg0!那麼我需要在app.js和employeeproviders.js中刪除哪些行? –

+0

將'mongodb:// localhost/mydb'更改爲您的自定義URI – Leg0

+0

對連接URI進行硬編碼是完美的功能,但在這種情況下,我建議您不要這樣做。 Heroku插件的一部分便利之處在於環境變量是爲您配置的 - 除非您想要,否則您不必在代碼存儲庫中包含敏感信息。 – Eric

10
var mongoUri = process.env.MONGOLAB_URI || 
    process.env.MONGOHQ_URL || 
    'mongodb://localhost/mydb'; 

此行應該已經是正確的,而無需改變任何東西。只要其中一個值存在,代碼就會短路,因此只有在環境變量中不存在MONGOLAB_URI或MONGOHQ_URL時才使用「mongodb:// localhost/mydb」。

這就是說,機會是一個給定的Heroku應用程序沒有使用兩個MongoDB提供程序,所以它是有道理的,只包括你打算使用的變量名稱。我的應用程序,例如,有:

var mongoUri = process.env.MONGOLAB_URI || 'mongodb://localhost/test' 
+0

謝謝Eric!應該是var employeeProvider = process.env.MONGOLAB_URI || 'mongodb的://本地主機/測試'; –

+0

我在評論var var employeeProvider = new EmployeeProvider('localhost',27017);並把var mongoUri = process.env.MONGOLAB_URI || 'mongodb:// localhost/test'在我的app.js中,它給我一個應用程序錯誤。 –

+0

我要添加var mongoUri = process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || 'mongodb:// localhost/mydb'; mongo.Db.connect(mongoUri,函數(err,db)db.collection('mydocs',function(er,collection){0} {'mykey':'myvalue'},{safe :true},function(er,rs){ }); }); }); to employeeprovider.js,因爲那是我的要求(mongo)。我試着將它添加到app.js中,但它不起作用。 –

1

首先檢查你的NODE_ENV環境

$ heroku config 
=== ### Config Vars 
MONGODB_URI:   mongodb://heroku_lhwpq2p3:[email protected]:dsvsd/heroku_lsdv 
NODE_ENV:    production 
NPM_CONFIG_PRODUCTION: true 

你把變種名稱

mongoUri = process.env.MONGOLAB_URI || localhost:.. 

應該是:

var mongoUri = process.env.MONGODB_URI || localhost:.. 

如果錯誤仍然存​​在,那麼你需要從發展NODE_ENV環境變量設置爲生產,如:

$ heroku config:set NODE_ENV="production" 
$ heroku config:set NPM_CONFIG_PRODUCTION=true 
相關問題