Node.js 如何使用MongoDB在Heroku上设置MongoDB数据库?

Node.js 如何使用MongoDB在Heroku上设置MongoDB数据库?,node.js,mongodb,express,mlab,Node.js,Mongodb,Express,Mlab,我使用的是Express.js和MongoLab,我在生产中使用了这段代码 //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) {

我使用的是Express.js和MongoLab,我在生产中使用了这段代码

//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中):

这将在索引页上呈现新表单,并允许我将其保存在本地,但不保存在生产中,因为我不知道如何设置电子邮件收集。有人能带我走过这段路吗?使用MongoDB和Node.js是全新的,因此需要一些帮助

编辑:

在MongoLab数据库界面中,我进行了一个名为
电子邮件的
收集。这是正确的行动方针吗

编辑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);
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;
emailprovider.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);
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;
var Db=require('mongodb').Db;
var Connection=require('mongodb')。连接;
var Server=require('mongodb')。Server;
var BSON=require('mongodb').BSON;
var ObjectID=require('mongodb')。ObjectID;
EmailProvider=功能(主机、端口){
this.db=newdb('localdb',新服务器(主机,端口,{safe:false},{auto_reconnect:true},{}));
this.db.open(函数(){});
};
EmailProvider.prototype.getCollection=函数(回调){
此.db.collection('email',函数(错误,email\u collection){
如果(错误)回调(错误);
else回调(空,电子邮件收集);
});
};
//保存新电子邮件
EmailProvider.prototype.save=函数(电子邮件、回调){
this.getCollection(函数(错误,电子邮件收集){
如果(错误)回调(错误)
否则{
if(类型(电子邮件地址)=“未定义”)
电子邮件=[电子邮件];
对于(var i=0;i
虽然第一个代码框中的连接代码似乎正确,但emailProvider对象没有使用它。相反,在app.js中,EmailProvider连接到localhost:27017,数据库名称在EmailProvider.js中硬编码为“localdb”

相反,您要做的是在EmailProvider中使用MONGOLAB_URI环境变量中提供的连接信息,其中已经包含主机、端口和数据库名称


有很多方法可以做到这一点,但其中一种方法是将连接代码从第一个代码框移动到EmailProvider构造函数中,然后更改构造函数,使其采用URI而不是主机和端口。这样,您就可以将MONGOLAB_URI变量传递给app.js中的构造函数。

Hi!似乎缺少了一些上下文。您的MongoDB连接代码看起来不错,但emailProvider的定义是什么?@robert OK,我进行了编辑以使其更易于理解发生的事情。我是否正确地理解了您的emailProvider正在连接到localhost:27017?您想将其连接到MongoLab数据库吗?@robert是的,我想将其连接到MongoLab或Heroku上。好的,如图所示的代码正在连接到localhost:27017/localdb上的数据库,您的第一个代码块中的所有设置都将被忽略。我将首先更改EmailProvider构造函数,使其采用URI而不是主机和端口,并将第一个代码块中显示的正确连接逻辑移到其中。然后,在app.js中,将MONGOLAB_URI传递给构造函数,而不是“localhost”和27017。