在Heroku上用Node创buildmongodb

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

我喜欢把上面的数据库function放在一个文件中,然后在我的主服务器文件中需要这个文件,如下所示:

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 

它工作正常。 不过,现在我试图用蒙哥拉插件把整个东西推到Heroku上

 heroku addons:add mongolab 

但数据库没有运行,我不知道如何使它运行。 本教程介绍了如何使用mongolab URI设置mongodb,但这不是我的代码工作方式,我使用主机和端口,并基于此创build新的服务器。 我应该如何改变我的代码,以在heroku应用程序上工作? 我想保持数据库代码在一个单独的文件中,与原型function。

按照这里的例子在“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的交互。 看看我的答案在这里如何构build你的模式。

由Xinzz的回答帮助,这里是修改的代码,以便mongodb数据库初始化与URI而不是主机+端口。 这就是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); }); 

这里的关键是首先声明variablesdb和用户,在MongoClient的connect函数的asynchronouscallback中为它们分配一个值,并在同一callback中启动app( app.listen(...) )。 然后在代码中,我可以做到以下几点:

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

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