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에서 콜렉션을 읽는다. 문제는 데이터가 여전히 대기열에 있고 컬렉션에 기록된다는 것입니다.
어떻게 해결할 수 있습니까? 비동기 개념을 포기? 클로저 사용 하시겠습니까? 최고의 콜백 구현을 찾으십니까?
감사를 작동합니다. 나는 오늘 시험 할 것이다. 하나의 질문인데 왜 다른 배열 "arr"을 만드나요? "insert"함수로 "dataArray"를 직접 사용할 수 있습니까? –
dataArray가 어떤 모습인지 모르고'var objAdd = JSON.parse ('{ "data":'+ dataArray [i] + '}'); '그래서 arr.push ({ data : dataArray [i]});'dataArray가 객체의 배열이면 직접 사용할 수 있습니다. – Molda