使用Node在Heroku上设置mongodb

时间:2013-12-05 03:41:32

标签: node.js mongodb heroku

在我的本地主机上,我有以下节点代码来设置mongoDB数据库名称“dbname”:

users.js:

var MongoClient = require("mongodb").MongoClient,
    Connection = require("mongodb").Connection,
    Server = require("mongodb").Server;

Users = function(host, port) {
  var mongoClient = new MongoClient(new Server(host, port));
  mongoClient.open(function (){});
  this.db = mongoClient.db("dbname");
};

Users.prototype.getCollection = function (callback) {
  this.db.collection("users", function (error, users) {
    if (error) callback(error);
    else callback(null, users);
  });
};

Users.prototype.findAll = function (callback) {
  this.getCollection(function (error, users) {
    if (error) {
      callback(error);
    } else {
      users.find().toArray(function (error, results) {
        if (error) {
          callback(error);
        } else {
          callback(null,results);
        }
      });
    }
  });
}

// Bunch of other prototype functions...

exports.Users = Users;

我喜欢将上面的数据库功能放在一个文件中,然后在我的主服务器文件中要求该文件如下:

server.js:

var Users = require("./users").Users;
var users = new Users("localhost", 27017);
users.findAll(function (err, user) {
  // Do something
});

让这个在localhost上工作非常简单。在命令行中,我只需输入以下内容:

$ mongod # to launch the database server
$ node server.js # to launch the web server

它工作正常。但是,现在我正试图用mongolab插件将整个东西推到Heroku上

heroku addons:add mongolab

但是数据库没有运行,我不知道如何让它运行。 This tutorial解释了如何使用mongolab URI设置mongodb,但这不是我的代码如何工作,我使用主机和端口,我基于此创建一个新的服务器。我应该如何更改我的代码才能在heroku应用程序上运行?我想用原型函数将数据库代码保存在一个单独的文件中。

2 个答案:

答案 0 :(得分:2)

按照“MongoClient.connect”部分中的示例here

基本上,您需要更改代码的这一部分:

Users = function(host, port) {
  var mongoClient = new MongoClient(new Server(host, port));
  mongoClient.open(function (){});
  this.db = mongoClient.db("dbname");
};

使用mongoClient.connect()而不是新的MongoClient:

Users = function(url) {
  MongoClient.connect(url, function(err, db) {
    // Find better way to set this since this callback is asynchronous.
    this.db = db;
  });
};

如果您正在使用节点,我建议使用mongoose npm install mongoose等库来处理mongodb交互。请查看我的答案here,了解如何构建模式。

答案 1 :(得分:1)

在Xinzz的回答的帮助下,这里是修改后的代码,因此使用URI而不是host + port初始化mongodb数据库。这就是Heroku初始化mongodb数据库的方式,这就是它无法正常工作的原因。

var mongodb = require("mongodb");

var MONGODB_URI = process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || "mongodb://localhost", // Make sure to replace that URI with the one provided by MongoLab
    db,
    users;

mongodb.MongoClient.connect(MONGODB_URI, function (err, database) {
  if (err) throw err;
  db = database;
  users = db.collection("users");
  accounts = db.collection("accounts");
  var server = app.listen(process.env.PORT || 3000);
  console.log("Express server started on port %s", server.address().port);
});

这里的关键是先声明变量db和users,在MongoClient的connect函数的异步回调中为它们赋值,并在同一个回调中启动app(app.listen(...))。然后在代码中我可以执行以下操作:

users.find().toArray(function (err, results) {
  // Do something
});

我也放弃了所有这些原型功能,因为它们并没有真正增加太多。