2017-12-21 24 views
0

私はnodeJSの初心者です。私は非同期的な考え方を管理するいくつかの問題があります。 MongoDBデータベースにデータを保存しようとしました。 websocketサービスから私のデータを1ミリ秒から5秒ごとに受け取ります。非同期node.jsを実装したMongoコレクションの書き込みと読み込み

5秒ごとに問題はありませんが、1msごとにコレクションコンテンツを表示すると、データは保存されていません。

は、ここに私のコードです:

私はのためのループが実行された場合、非同期プロセスは、テーブルの各データを反復して実行されるように、インサートのデータベース機能を待っていない参照
 // --Websocket event coming every 1 ms--// 
    while (1) { //Simulate Websocket events coming every 1 ms 
     dataBookSave(dataArrayfunction, function(log) { //array of data received from websocket event 
       console.log(log); //Display the callback log from the function dataBookSave 
       var query = ""; // Empty query in MongDB to retrieve all datas 
       mongoDb.find(dbName, collectionName, query, function(result) { // get all datas from the MongoDB collection. 
        console.log(results); //Display all datas from my MongoDB collection 
       }); 

      } 
     } 


     function dataBookSave(dataArray, callback) { 
      if (dataArray.length < 1) callback("dataBookSave1"); //test if the array is empty. if yes, generate the callback 
      for (var i = 0; i < dataArray.length; i++) { 
       (function(i) { //closure the for loop 
        var objAdd = JSON.parse('{"data" : ' + dataArray[i] + ' }'); // create the object to add in the collection 
        mongoDb.insertCollection(dbName, collectionName, objAdd, function() { // insert function in MongoDB 
         if (i == dataArray.length - 1) // test if the loop is finished. 
         { 
          callback("dataBookSave2"); // if yes, generate the callback 
         } 
        }); 
       })(i); 
      } 
     } 


function insertCollection(dbName, collectionName, myObj, callback) { 
    var MongoClient = require('mongodb').MongoClient; 
    var url = "mongodb://localhost:27017/" + dbName; 

    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 
     var dbase = db.db(dbName); 

     dbase.collection(collectionName).insertOne(myObj, function(err, res) { 
      if (err) throw err; 
      db.close(); 
      callback(); 
     }); 
    }); 

} 

function find(dbName, collectionName, query, callback) { 
    var MongoClient = require('mongodb').MongoClient; 
    var url = "mongodb://localhost:27017/" + dbName; 
    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 
     var dbase = db.db(dbName); 

     dbase.collection(collectionName).find(query).sort({ 
      _id: -1 
     }).toArray(function(err, result) { 
      if (err) throw err; 
      callback(result); 
      db.close(); 
     }); 
    }); 
} 

。 forループが終了すると、私はMongoDBのコレクションを読みます。問題は、データが依然としてキューにあり、コレクションに書き込まれることです。

どうすれば解決できますか?非同期の概念をあきらめますか?クロージャを使用しますか?最適なコールバック実装を見つける

答えて

0

あなたは間違いなく1msごとにあなたのデータベースへの接続を閉じたり閉じたりしたくありません。この場合、接続を開いたままにすることをお勧めします。

私は、コード怒鳴るを実行していないが、それは

var MongoClient = require('mongodb').MongoClient; 
var url = "mongodb://localhost:27017/" + dbName; 

var mongodb; 
var collectionName = "some-collection"; 

MongoClient.connect(url, function(err, db) { 
    if (err) throw err; 
    mongodb = db; 

    run(); 
}); 

function run() { 
     // --Websocket event coming every 1 ms--// 
    while (1) { //Simulate Websocket events coming every 1 ms 
     dataBookSave(dataArrayfunction, function(log) { //array of data received from websocket event 

      console.log(log); //Display the callback log from the function dataBookSave 

      find(collectionName, function(result) { // get all datas from the MongoDB collection. 
       console.log(results); //Display all datas from my MongoDB collection 
      }); 
     }); 
    } 
} 

function dataBookSave(dataArray, callback) { 
    if (dataArray.length < 1) callback("dataBookSave1"); 

    var arr = []; 
    // push object to arr for bulk insertion 
    for (var i = 0; i < dataArray.length; i++) { 
     arr.push({ 
      data: dataArray[i] 
     }); 
    } 

    insert(collectionName, arr, function() { 
     callback("dataBookSave2"); 
    }); 
} 

function insert(col, arr, callback) { 

    mongodb 
    .collection(col) 
    .insertMany(arr, function(err, res) { 

     if (err) throw err; 
     callback(); 
    }); 

} 

function find(collectionName, query, callback) { 

    mongodb 
    .collection(collectionName) 
    .find(query) 
    .sort({ _id: -1 }) 
    .toArray(function(err, result) { 

     if (err) throw err; 
     callback(result); 
    }); 
} 
+0

おかげで動作するはずです。今日はやってみよう。ちょうど1つの質問、なぜあなたは他の配列 "arr"を作成しますか? "insert"関数で直接 "dataArray"を使用することはできませんか? –

+0

dataArrayがどのように見えていて、 'var objAdd = JSON.parse( '{data":' + dataArray [i] + '}'); data:dataArray [i]}); 'dataArrayがオブジェクトの配列であれば、それを直接使うことができます。 – Molda

関連する問題