在我的本地主机上,我有以下节点代码来设置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应用程序上运行?我想用原型函数将数据库代码保存在一个单独的文件中。
答案 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
});
我也放弃了所有这些原型功能,因为它们并没有真正增加太多。