2015-08-15 2 views
0

При запуске следующего кода в NodeJS я получаю сообщение об ошибке MongoError: Connection Closed By Application. Я попытался разрешить это, но не смог все время. Мне нужна чья-то помощь ...MongoError: соединение закрыто приложением в драйвере MongoDB

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if(err) throw err; 

    var data = db.collection('data'); 
    var options = { 'sort' : [['State', 1], ['Temperature', -1]] }; 
    var cursor = data.find({}, {}, options); 

    var firstState = ''; 
    var currentState=''; 
    var previousState=''; 
    var previousRecord=''; 

    cursor.each(function(err, doc) { 
     if(err) throw err; 
     if(doc == null) { 
      return db.close(); 
     } 

     currentState= doc['State']; 
     previousState = previousRecord['State']; 

     if(previousState === undefined) {   
      console.dir(currentState); 
      firstState= doc['State']; 

      db.collection('data').update({'_id' : doc['_id']}, {$set :{'month_high' : true}}, {'upsert' : true}, function(err, upserted){ 
       if(err) throw err; 

       console.dir("Successfully upserted "+upserted + " document!"); 
      }); 

     } else if(currentState !=previousState){ 
       if (firstState!=currentState){     
        console.dir(previousState); 

       db.collection('data').update({'_id' : previousRecord['_id']}, {$set :{'month_high' : true}}, {'upsert' : true}, function(err, upserted){ 
       if(err) throw err;    

       console.dir("Successfully upserted "+upserted + " document!"); 
      }); 

       } 
      }   

     previousRecord = doc; 
    }); 
}); 

ответ

0

я переписал приложение, реализующее node stream интерфейс, который, наконец, решен вопрос о «MongoError: Соединение закрыто Применение».

var MongoClient = require('mongodb').MongoClient; 
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if(err) throw err; 
    var data = db.collection('data'); 
    var options = { 'sort' : [['State', 1], ['Temperature', -1]] }; 
    var cursor = data.find({}, {}, options); 

    var previousState=''; 

    cursor.on("end", function(){ 
     db.close(); 
    }); 

    cursor.on("err", function(){ 
     console.dir("Error on:" + err); 
     throw err; 
    }); 

cursor.on("data", function(doc){ 
    cursor.pause(); 
    if(previousState != doc.State){ 
     previousState = doc.State; 
     var query = { _id: doc._id}; 
     var operator = {$set: {month_high: true}}; 

     db.collection('data').update(query, operator, {'upsert' : true}, function(err, upserted){ 
      if(err){ 
       console.dir('Error : '+ err); 
       throw err; 
      } 
      console.dir("Successfully upserted "+ upserted + " document!"); 
      cursor.resume(); 
     }); 
    } else{ 
      cursor.resume(); 
    } 
}); 

});

1

Это асинхронный код с асинхронными вызовами базы данных, однако .each() итераторов используются здесь не ждут Содержащихся обратных вызовов для завершения.

Это основная причина ошибки здесь, так как обработка на самом деле не завершена к моменту вызова db.close(). Итак, это то, что нужно исправить.

Несмотря на то, что общая очистка вашего кода была в порядке, основные функции здесь заменяют этот цикл на stream processing, а также избегают «повторных вызовов» на «обновление», просто изменяя условия и сохраняя управление потоком в одном месте:

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) { 
    if(err) throw err; 

    var data = db.collection('data'); 
    var options = { 'sort' : [['State', 1], ['Temperature', -1]] }; 
    var cursor = data.find({}, {}, options); 

    var firstState = '', 
    currentState='', 
    previousState='', 
    previousRecord=''; 


    cursor.on("end",function() { 
    db.close(); 
    }); 

    cursor.on("err",function(err) { 
    throw err; 
    }); 

    cursor.on("data",function(data){ 
    cursor.pause();   // Stops events emitting on stream 
    currentState = doc.State; 
    previousState = previousRecord.State; 

    var query = { "_id": null }; 

    if (previousState === undefined) {   
     console.dir(currentState); 
     firstState= doc.State; 
     query._id = doc._id; 
    } else if(currentState != previousState) { 
     if (firstState != currentState) { 
     console.dir(previousState); 
     query._id = previousRecord._id; 
     } 
    }   

    if (query._id != null) { 
     db.collection('data').update(
     query, 
     { "$set":{ "month_high": true } }, 
     { "upsert": true }, 
     function(err, upserted){ 
      if(err) throw err; 

      console.dir("Successfully upserted "+upserted + " document!"); 
      cursor.resume();  // resumes events on stream 
      previousRecord = doc; 

     }); 
    } else { 
     cursor.resume();   // resumes events on stream 
     previousRecord = doc; 
    } 

    }); 
}); 

в .pause() и .resume() метод там убедитесь, что новые данные не излучаются в потоке, пока текущая обработка не выполняются для текущего документа, извлеченного. Это позволяет проверить внешние переменные.

Обратите внимание, что .resume() также называется «внутри» обратного вызова к .update(), так как вы не хотите продолжать, пока это не будет возвращено как завершено.

+0

Я хотел бы поблагодарить вас за ваше драгоценное время и помощь, но я получаю сообщение об ошибке при запуске программы, которую вы мне дали. Можете ли вы протестировать его там и повторно отправить его снова. Могут быть некоторые скобки или какая-то другая проблема. Я попытался понять это сам, но не мог из-за недостатка знаний в потоковой обработке. С нетерпением жду Вашего ответа. – Simant

+0

@DPBhatt Какая ошибка? Я на самом деле ничего не сделал, кроме как вырезать и вставлять бит вашего кода в правильные разделы и удалять дублирование кода. Поэтому я не пишу вашу программу, просто показываю, как правильно структурировать и уважать, ожидая завершения обратных вызовов. Любые ошибки - это ошибка вашей собственной реализованной логики. Который я действительно не изменил. –

+0

«@Blakes Seven» Я хотел бы поблагодарить вас за концепцию потока, которую я совершенно не знал в Nodejs. Я переписал программу, чтобы исправить некоторую логику, которая была неправильной в моей стороне. Еще одна проблема в функции обратного вызова cursor.on («data», function (data) {. Вы использовали здесь данные, но в программе, ссылающейся на doc.State, что является второстепенным я заметил это при переписывании программы. логика тоже. Я отправляю правильную логику. Еще раз спасибо за помощь, которая была действительно много. – Simant

Смежные вопросы