7

私は Express.js と MongoLab を使用しており、Heroku のセットアップに従って MongoDBを本番環境で動作させ、このコードを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 を使用するのは初めてなので、助けが必要です。

編集:

The MongoLab Database Interface で、私collectionemails. これは正しい行動ですか?

編集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;
4

1 に答える 1

6

最初のコード ボックスの接続コードは正しいように見えますが、emailProvider オブジェクトはそれを使用していません。代わりに、app.js では、EmailProvider が localhost:27017 に接続され、データベース名が emailprovider.js で「localdb」としてハードコーディングされています。

代わりに、ホスト、ポート、およびデータベース名が既に含まれている、EmailProvider の MONGOLAB_URI 環境変数で提供される接続情報を使用します。

これを行う方法はいくつかありますが、接続コードを最初のコード ボックスから EmailProvider コンストラクターに移動し、ホストとポートの代わりに URI を取るようにコンストラクターを変更する方法があります。そうすれば、MONGOLAB_URI 変数を app.js のコンストラクターに渡すことができます。

于 2013-05-21T03:25:36.270 に答える