使用 Node.JS 从 mongodb 到 MongoLab
Posted
技术标签:
【中文标题】使用 Node.JS 从 mongodb 到 MongoLab【英文标题】:Going from mongodb to MongoLab using Node.JS 【发布时间】:2013-10-20 19:28:36 【问题描述】:我正在尝试做这个家伙在这里做的同样的事情How do I setup MongoDB database on Heroku with MongoLab?
该应用在 Amazon EC2 上运行,我正在使用 MongoLabs 插件部署到 Heroku。
我究竟应该键入什么来将 mongo 连接更改为 Mongo URI?
Heroku 文档
/** https://devcenter.heroku.com/articles/getting-started-with-nodejs#write-your-app */
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
/** app.js */
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, EmployeeProvider = require('./employeeprovider').EmployeeProvider;
var app = express();
app.configure(function()
app.set('port', process.env.PORT || 8080);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('view options', layout: false);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));
);
app.configure('development', function()
app.use(express.errorHandler());
);
var employeeProvider= new EmployeeProvider('localhost', 27017);
//Routes
app.get('/', function(req, res)
employeeProvider.findAll(function(error, emps)
res.render('index',
title: 'Employees',
employees:emps
);
);
);
app.get('/employee/new', function(req, res)
res.render('employee_new',
title: 'New Employee'
);
);
//save new employee
app.post('/employee/new', function(req, res)
employeeProvider.save(
title: req.param('title'),
name: req.param('name')
, function( error, docs)
res.redirect('/')
);
);
app.listen(8080);
employeeprovider.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;
EmployeeProvider = function(host, port)
this.db= new Db('node-mongo-employee', new Server(host, port, safe: true, auto_reconnect: true, ));
this.db.open(function());
;
EmployeeProvider.prototype.getCollection= function(callback)
this.db.collection('employees', function(error, employee_collection)
if( error ) callback(error);
else callback(null, employee_collection);
);
;
//find all employees
EmployeeProvider.prototype.findAll = function(callback)
this.getCollection(function(error, employee_collection)
if( error ) callback(error)
else
employee_collection.find().toArray(function(error, results)
if( error ) callback(error)
else callback(null, results)
);
);
;
//save new employee
EmployeeProvider.prototype.save = function(employees, callback)
this.getCollection(function(error, employee_collection)
if( error ) callback(error)
else
if( typeof(employees.length)=="undefined")
employees = [employees];
for( var i =0;i< employees.length;i++ )
employee = employees[i];
employee.created_at = new Date();
employee_collection.insert(employees, function()
callback(null, employees);
);
);
;
exports.EmployeeProvider = EmployeeProvider;
如何更改 employeeProvider 以使用 URI 而不是 localhost?
【问题讨论】:
有一个例子在:github.com/mongolab/mongodb-driver-examples/blob/master/nodejs/… 【参考方案1】:我使用的是 MongoHQ,但它类似,首先您需要在插件中为您的数据库创建用户,然后将凭据添加到 URI(您应该在您的 mongo 插件中看到 uri) 示例:
mongodb://user:pass@paulo.mongohq.com:10000/app12345678
【讨论】:
感谢 Leg0!那么我需要在 app.js 和 employeeproviders.js 中删除哪些行呢? 将 'mongodb://localhost/mydb' 更改为您的自定义 uri 硬编码您的连接 URI 非常实用,但在这种情况下我建议不要这样做。 Heroku 插件的部分便利在于为您配置了环境变量——除非您愿意,否则您不必在代码存储库中包含敏感信息。【参考方案2】:var mongoUri = process.env.MONGOLAB_URI ||
process.env.MONGOHQ_URL ||
'mongodb://localhost/mydb';
这一行应该已经是正确的,无需更改任何内容。只要其中一个值存在,代码就会短路,因此仅当环境变量中不存在 MONGOLAB_URI 或 MONGOHQ_URL 时才使用“mongodb://localhost/mydb”。
也就是说,给定的 Heroku 应用程序可能没有同时使用这两个 MongoDB 提供程序,因此只包含您打算使用的变量名是有意义的。例如,我的应用有:
var mongoUri = process.env.MONGOLAB_URI || 'mongodb://localhost/test'
【讨论】:
谢谢埃里克!应该是 var employeeProvider= process.env.MONGOLAB_URI || 'mongodb://localhost/test'; 我正在注释掉 var employeeProvider= new EmployeeProvider('localhost', 27017);并把 var mongoUri = process.env.MONGOLAB_URI || 'mongodb://localhost/test' 在我的 app.js 中,它给了我一个应用程序错误。 我正在添加 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,函数(er,rs) ); ); );到 employeeprovider.js 因为那是我的 require(mongo) 所在的地方。我尝试将其添加到 app.js 中,但没有成功。 我不相信 db 类有连接方法。我们建议使用 mongoclient 类来建立连接,因为它现在是标准的连接方式。你可以在这里找到一个例子:github.com/mongolab/node-connection-pooling/blob/master/good.js【参考方案3】:首先检查你的NODE_ENV环境
$ heroku config
=== ### Config Vars
MONGODB_URI: mongodb://heroku_lhwpq2p3:sdvsdvsdvds@sdvsdv.mlab.com:dsvsd/heroku_lsdv
NODE_ENV: production
NPM_CONFIG_PRODUCTION: true
你在 var 中输入的名字
mongoUri = process.env.MONGOLAB_URI || localhost:..
应该是:
var mongoUri = process.env.MONGODB_URI || localhost:..
如果错误仍然存在,那么您需要将 NODE_ENV 环境变量从开发设置为生产,例如:
$ heroku config:set NODE_ENV="production"
$ heroku config:set NPM_CONFIG_PRODUCTION=true
【讨论】:
以上是关于使用 Node.JS 从 mongodb 到 MongoLab的主要内容,如果未能解决你的问题,请参考以下文章
mongoDB: Aggregation - 是不是有相当于原生 node.js 驱动程序的 $lookup 连接?
如何将 mongodb 数据从服务器(node.js)检索到我的 AngularJS 路由
Node.js 无法从 Heroku 连接到 mongodb 3 到 Mongolab:SCRAM-SHA-1