2016-08-28 5 views
0

mongolab.comでホストされているMongoDBにテキストの配列の配列を保存するこのnode.jsコードがあります。私はMongoose ORMを使用し、コードがデータベースに接続するが、保存メソッドは実行されないことに注意してください。mongooseが私のモデルを保存しない理由

function save2Db(texts) { 
    var db = require('mongoose'); 
    db.Promise = global.Promise; 
    db.connect('mongodb://user:[email protected]:13456/heroku_xxxxxxx'); 
    db.connection.on('error', console.error.bind(console, 'connection error!')); 
    db.connection.on('close', console.error.bind(console, 'closed db!')); 
    db.connection.once('open', function() { 
     console.log('opened db!'); 

     /* Create schema */ 
     var textSchema = new db.Schema({ 
      date: { type: Date, default: Date.now }, 
      text: [String] 
     }); 

     /* Create model */ 
     var TextModel = db.model('Text', textSchema, 'testCollection'); 

     /* Save data to database */ 
     texts.forEach(function(content) { 

      console.log(`saving ${content}`); 

      var t = new TextModel({text : content}); 

      t.save(function (err) { 
       console.log('inside t.save'); 
       if (err) { 
        console.error(err); 
       } else { 
        console.log('Saved to db'); 
       } 
      }); //t.save 
     }); // texts.forEach 

     db.connection.close(); 
    }); 
} 

save2Db([['a','b'],['c'],['d','e','f','g']]) 

し、Saveメソッドが動作しない理由を

opened db! 
saving a,b 
saving c 
saving d,e,f,g 
closed db! 

は、あなたが知っていた出力を得ますか?ありがとうございました。

答えて

1

t.saveは、非同期機能です。保存を実行する前に、データベースの接続をクローズしています。 db接続を閉じるには、すべての保存コールバックが呼び出されるまで待つ必要があります。私は約束を使用することをお勧めします。

function save2Db(texts) { 
    var db = require('mongoose'); 
    db.Promise = global.Promise; 
    db.connect('mongodb://user:[email protected]:13456/heroku_xxxxxxx'); 
    db.connection.on('error', console.error.bind(console, 'connection error!')); 
    db.connection.on('close', console.error.bind(console, 'closed db!')); 
    db.connection.once('open', function() { 
     console.log('opened db!'); 

     /* Create schema */ 
     var textSchema = new db.Schema({ 
      date: { 
       type: Date, 
       default: Date.now 
      }, 
      text: [String] 
     }); 

     /* Create model */ 
     var TextModel = db.model('Text', textSchema, 'testCollection'); 

     /* Save data to database */ 
     var saves = []; 
     texts.forEach(function(content) { 

      console.log(`saving ${content}`); 

      var t = new TextModel({ 
       text: content 
      }); 
      saves.push(t.save()); 
     }); 
     Promise.all(saves) 
      .then(() => db.connection.close()) 
      .catch(err => { 
       console.log(err); 
       db.connection.close(); 
      }); 
    }); 
} 

いくつかの追加の注意事項:それはあなたが何かを保存するたびに呼び出されますようあなたのsave2Db機能のうち、使用しているデータベースの開始部分を移動する必要があります。とにかくあなたのマングースモデルがこれを行うように接続が開かれるまで待つ必要はありません。最後に重要なのは、dbコールを常時行っている場合は、データベース接続を閉じてデータベース接続を閉じる必要はありません。一度接続して開いておくだけです。

+0

ありがとうございます。あなたが言うまで、保存は非同期であることに気付かなかった。 – cody

関連する問題