2017-12-21 10 views
0

저는 초심자입니다. 비동기식 사고 방식을 관리하는 데 몇 가지 문제가 있습니다. MongoDB 데이터베이스에 데이터를 저장하고 retieve하려고합니다. websocket 서비스에서 각 1ms ~ 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마다 DB에 연결/연결을 원하지 않습니다. 이 경우 연결을 열린 상태로 유지하는 것이 좋습니다.

나는 코드를 넣고 실행하지 않은하지만

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

감사를 작동합니다. 나는 오늘 시험 할 것이다. 하나의 질문인데 왜 다른 배열 "arr"을 만드나요? "insert"함수로 "dataArray"를 직접 사용할 수 있습니까? –

+0

dataArray가 어떤 모습인지 모르고'var objAdd = JSON.parse ('{ "data":'+ dataArray [i] + '}'); '그래서 arr.push ({ data : dataArray [i]});'dataArray가 객체의 배열이면 직접 사용할 수 있습니다. – Molda