简体   繁体   中英

Going from mongodb to MongoLab using Node.JS

I'm trying to do the same thing this guy's doing here How do I setup MongoDB database on Heroku with MongoLab?

The app works on Amazon EC2 and I'm deploying to Heroku with the MongoLabs add-on.

What exactly should I type to change the mongo connection to the Mongo URI?

Heroku Documentation

/** 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;

How would I change the employeeProvider to use the URI instead of the localhost?

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

This line should already be correct without having to change anything. The code short-circuits as soon as one of the values exists, so 'mongodb://localhost/mydb' is only used if neither MONGOLAB_URI or MONGOHQ_URL exist in the environment variables.

That said, chances are a given Heroku app isn't making use of both MongoDB providers, so it makes sense to only include the variable name you intend to use. My apps, for example, have:

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

First check your NODE_ENV environment

$ heroku config
=== ### Config Vars
MONGODB_URI:           mongodb://heroku_lhwpq2p3:sdvsdvsdvds@sdvsdv.mlab.com:dsvsd/heroku_lsdv
NODE_ENV:              production
NPM_CONFIG_PRODUCTION: true

the name you put in var

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

should be :

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

if the error still persists then you need to set the NODE_ENV environment variable from development to production like :

$ heroku config:set NODE_ENV="production"
$ heroku config:set NPM_CONFIG_PRODUCTION=true

I was using MongoHQ but its similar, first you need to create user in addon for your database and then add credentials to URI (you should see uri in your mongo addon) example:

mongodb://user:pass@paulo.mongohq.com:10000/app12345678

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM