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のコレクションを読みます。問題は、データが依然としてキューにあり、コレクションに書き込まれることです。
どうすれば解決できますか?非同期の概念をあきらめますか?クロージャを使用しますか?最適なコールバック実装を見つける
おかげで動作するはずです。今日はやってみよう。ちょうど1つの質問、なぜあなたは他の配列 "arr"を作成しますか? "insert"関数で直接 "dataArray"を使用することはできませんか? –
dataArrayがどのように見えていて、 'var objAdd = JSON.parse( '{data":' + dataArray [i] + '}'); data:dataArray [i]}); 'dataArrayがオブジェクトの配列であれば、それを直接使うことができます。 – Molda