2013-10-12 29 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 
相关问题