繁体   English   中英

使用Node在Heroku上设置mongodb

[英]Setting up mongodb on Heroku with Node

在我的本地主机上,我有以下节点代码来设置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

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

按照例如这里的“MongoClient.connect”部分。

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

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交互。 请看我的答案了解如何构建模式。

在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
});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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