【发布时间】:2013-05-15 15:50:55
【问题描述】:
我正在使用 Express.js 和 MongoLab,我在生产中遵循 Heroku setup to get MongoDB working 将这段代码扔到我的 app.js 中。
//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 中)有以下路由和字段:
//Routes
app.get('/', function(req, res) {
res.render('index', {
title: 'DumbyApp'
});
});
//save new email
app.post('/', function(req, res){
emailProvider.save({
address: req.param('address')
}, function( error, docs) {
res.redirect('/')
});
});
这会在索引页面上呈现新表单,并让我将其保存在本地,但不能保存在生产环境中,因为我不知道如何设置我的电子邮件集合。谁能帮我完成这个?使用 MongoDB 和 Node.js 的新手,所以可以使用一些帮助。
编辑:
在 MongoLab 数据库界面中,我创建了一个名为 emails 的 collection。这是正确的做法吗?
编辑 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);
emailprovider.js
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;
【问题讨论】:
-
嗨!似乎缺少一些上下文。您的 MongoDB 连接代码看起来不错,但是 emailProvider 的定义是什么?
-
@robert 好的,我进行了编辑以使其更容易理解正在发生的事情。
-
我是否正确阅读了您的 EmailProvider 正在连接到 localhost:27017?您是否尝试将其连接到您的 MongoLab 数据库?
-
@robert 是的,我想将它连接到 MongoLab 或 Heroku。
-
好的,如图所示的代码正在连接到位于 localhost:27017/localdb 的数据库,并且您的第一个代码块中的所有设置都将被忽略。我将首先更改 EmailProvider 构造函数以采用 URI 而不是主机和端口,并将您在第一个代码块中显示的正确连接逻辑移动到那里。然后,在 app.js 中,将 MONGOLAB_URI 传递给构造函数,而不是 'localhost' 和 27017。
标签: node.js mongodb express mlab